Rijndael kryptering af streams fejler: tekst mangler samt exception"Padding is invalid and cannot be removed"
HejJeg har et problem med følgende kode der smider exceptionen "Padding is invalid and cannot be removed". Den gør det bare ikke konsekvent, men alt afhængigt af hvilken tekst den "fodres med".
Koden er en omskrivning af noget jeg har fundet på nettet som arbejdede med filer og ikke streams som jeg har brug for (ufravigeligt krav). Jeg har derfor omskrevet metoderne med streams i stedet for filnavne som parametre. Det skal siges at på filer virker koden som den skal, men min kryptering skal foregå i memory og ikke på disken.
Min kode ser således ud:
using System.IO;
using System.Security.Cryptography;
namespace Cryptotest
{
class Scrambler
{
private string password;
private byte[] salt;
public Scrambler(string Password, string Salt)
{
password = Password;
salt = Encoding.ASCII.GetBytes(Salt);
}
public void EncrypStream(MemoryStream inStream, MemoryStream outStream)
{
// Step 1. Create the Symetrical algo object
SymmetricAlgorithm symAlgo = new RijndaelManaged();
symAlgo.Padding = PaddingMode.ISO10126;
// Step 3. Specify a key (optional)
Rfc2898DeriveBytes theKey = new Rfc2898DeriveBytes(password, salt);
symAlgo.Key = theKey.GetBytes(symAlgo.KeySize / 8);
symAlgo.IV = theKey.GetBytes(symAlgo.BlockSize / 8);
// Read the unencrypted file file into fileData
byte[] StreamData = new byte[inStream.Length];
inStream.Position = 0;
inStream.Read(StreamData, 0, (int)inStream.Length);
// Step 4. Create the ICryptoTransfor object
ICryptoTransform encryptor = symAlgo.CreateEncryptor();
// Step 5. Create teh Crypto Stream object
CryptoStream encryptStream = new CryptoStream(outStream, encryptor, CryptoStreamMode.Write);
// Step 6. Write the contents to the CryptoStream
encryptStream.Write(StreamData, 0, StreamData.Length);
outStream.Position = 0;
}
public void DecryptStream(MemoryStream inStream, MemoryStream outStream)
{
// Step 2. Create the Symetrical algo object
SymmetricAlgorithm symAlgo = new RijndaelManaged();
symAlgo.Padding = PaddingMode.ISO10126;
// Step 3. Specify a key (optional)
Rfc2898DeriveBytes theKey = new Rfc2898DeriveBytes(password, salt);
symAlgo.Key = theKey.GetBytes(symAlgo.KeySize / 8);
symAlgo.IV = theKey.GetBytes(symAlgo.BlockSize / 8);
// Step 4. Create the ICryptoTransfor object
ICryptoTransform decryptor = symAlgo.CreateDecryptor();
// Step 5. Create the Crypto Stream object
CryptoStream decryptStream = new CryptoStream(inStream, decryptor, CryptoStreamMode.Read);
// Step 6. Write the contents to the CryptoStream
// Read the encrypted file file into fileData
byte[] StreamData = new byte[inStream.Length];
inStream.Position = 0;
decryptStream.Read(StreamData, 0, (int)inStream.Length);
// Save unecrypted data
outStream.Write(StreamData, 0, StreamData.Length);
outStream.Position = 0;
}
}
}
Anvender jeg teksten "Mit password" som Password og "This is my salt" som SALT samt følgende som den klar tekst jeg fylder i streamen der anvendes som inStream på EncrypStream, så kan jeg godt kryptere teksten.
"<Vault>
<Box>
<BoxID>25</BoxID>
<Description>En Test</Description>
</Box>
<Box>
<BoxID>15</BoxID>
<Description>Mere Test</Description>
</Box>
</Vault>
"
Jeg viser den stream jeg får retur i en tekstbox, for at se at streamen indeholdt data og de er blevet krypteret, og anvender indholdet af denne tekstboks som det der fyldes i den stream der anvendes som inStream på DecryptStream.
Det jeg så får tilbage er teksten:
"<Vault>
<Box>
<BoxID>25</BoxID>
<Description>En Test</Description>
</Box>
<Box>
<BoxID>15</BoxID>
<Description>Mere Test</Description>
</Bo"
der mangler altså:
"x>
</Vault>
".
Fjerner man det fra klarteksten og prøver igen, så kommer exceptionen.
Dette spørgsmål http://www.eksperten.dk/spm/703843 lugter af samme problemstilling, men jeg kan se lyset i den tråd til at løse mit problem.
Mine spørgsmål er nu - Why not work?:
1.
Hvorfor får jeg ikke hele teksten dekrypteret?
2.
Hvorfor fejler det 2. gang, den tekst der skal krypteres burde da ikke have indflydelse på om det går godt eller skidt, eller har jeg misforstået noget i denne sammenhæng.
Jeg ser frem til løsningen på mit problem fra den kompetente skare af kloge hoveder der findes her på Eksperten.
/Morten