Hallo zusammen!
Ich bin mal wieder auf eure Hilfe angewiesen... ich versuche einzelne byte-Arrays mit Hilfe des Rijndael-Algorithmus zu ver- und entschlüsseln. Die Arrays haben immer garantiert eine Größe von 16 Byte, was einer Aes-Blocklänge genau entspricht. Jetzt erst mal der Code, dann erklär ich mein Problem:
public static void Encrypt(Message message)
{
//create byte array from first part of the message (i.e. content, timeStamp, id)
byte[] dataToEncrypt = new byte[16];
for (int i = 0; i < message.content.Length; i++)
{
dataToEncrypt[i] = message.content[i];
}
for (int i = 0; i < message.timeStamp.Length; i++)
{
dataToEncrypt[i+8] = message.timeStamp[i];
}
for (int i = 0; i < message.id.Length; i++)
{
dataToEncrypt[i+12] = message.id[i];
}
//encrypt first part of the message
byte[] encryptedData = AesEncrypt(dataToEncrypt);
//copy encrypted data into message
for (int i = 0; i < message.content.Length; i++)
{
message.content[i] = encryptedData[i];
}
for (int i = 0; i < message.timeStamp.Length; i++)
{
message.timeStamp[i] = encryptedData[i+8];
}
for (int i = 0; i < message.id.Length; i++)
{
message.id[i] = encryptedData[i+12];
}
//create byte array from second part of the message (i.e. hash)
dataToEncrypt = message.hash;
//encrypt second part of the message
encryptedData = AesEncrypt(dataToEncrypt);
//copy encrypted data into message
message.hash = encryptedData;
//Test
Decrypt(message);
}
public static void Decrypt(Message message)
{
//create byte array from first part of the message (i.e. content, timeStamp, id)
byte[] dataToDecrypt = new byte[16];
for (int i = 0; i < message.content.Length; i++)
{
dataToDecrypt[i] = message.content[i];
}
for (int i = 0; i < message.timeStamp.Length; i++)
{
dataToDecrypt[i+8] = message.timeStamp[i];
}
for (int i = 0; i < message.id.Length; i++)
{
dataToDecrypt[i+12] = message.id[i];
}
//decrypt first part of the message
byte[] decryptedData = AesDecrypt(dataToDecrypt);
//copy decrypted data into message
for (int i = 0; i < message.content.Length; i++)
{
message.content[i] = decryptedData[i];
}
for (int i = 0; i < message.timeStamp.Length; i++)
{
message.timeStamp[i] = decryptedData[i+8];
}
for (int i = 0; i < message.id.Length; i++)
{
message.id[i] = decryptedData[i+12];
}
//create byte array from second part of the message (i.e. hash)
dataToDecrypt = message.hash;
//decrypt second part of the message
decryptedData = AesDecrypt(dataToDecrypt);
//copy decrypted data into message
message.hash = decryptedData;
}
private static byte[] AesEncrypt(byte[] dataToEncrypt)
{
Rijndael aes = Rijndael.Create();
//aes.BlockSize = 128;
aes.Mode = CipherMode.ECB;
aes.Key = key;
aes.IV = iv;
ICryptoTransform transform = aes.CreateEncryptor();
byte[] encryptedData = new byte[16];
transform.TransformBlock (dataToEncrypt,0,dataToEncrypt.Length,encryptedData,encryptedData.Length);
return encryptedData;
}
private static byte[] AesDecrypt(byte[] dataToDecrypt)
{
Rijndael aes = Rijndael.Create();
//aes.BlockSize = 128;
aes.Mode = CipherMode.ECB;
aes.Key = key;
aes.IV = iv;
byte[] decryptedData = new byte[16];
ICryptoTransform transform = aes.CreateDecryptor();
transform.TransformBlock (dataToDecrypt,0,dataToDecrypt.Length,decryptedData,decryptedData.Length);
return decryptedData;
}
private static byte[] AesEncrypt2(byte[] dataToEncrypt)
{
Rijndael aes = Rijndael.Create();
//aes.BlockSize = 128;
aes.Mode = CipherMode.ECB;
aes.Key = key;
aes.IV = iv;
byte[] encryptedData = new byte[16];
MemoryStream data = new MemoryStream();
ICryptoTransform transform = aes.CreateEncryptor();
CryptoStream cs = new CryptoStream(data,transform,CryptoStreamMode.Write);
cs.Write(dataToEncrypt,0,dataToEncrypt.Length);
cs.FlushFinalBlock();
encryptedData = data.ToArray();
cs.Close();
data.Close();
return encryptedData;
}
private static byte[] AesDecrypt2(byte[] dataToDecrypt)
{
Rijndael aes = Rijndael.Create();
//aes.BlockSize = 128;
aes.Mode = CipherMode.ECB;
aes.Key = key;
aes.IV = iv;
byte[] decryptedData = new byte[16];
MemoryStream data = new MemoryStream();
ICryptoTransform transform = aes.CreateDecryptor();
data.Write(dataToDecrypt,0,dataToDecrypt.Length);
CryptoStream cs = new CryptoStream(data,transform,CryptoStreamMode.Read);
cs.Read(decryptedData,0,decryptedData.Length);
cs.Close();
data.Close();
return decryptedData;
}
Die Methoden Encrypt und Decrypt sind hauptsächlich dafür verantwortlich, die erforderlichen Daten in ein 16 byte großes Array zu schreiben, die Ver- oder Entschlüsselung aufzurufen und das Ergebnis wiederum zu verarbeiten.
Wie man sieht, habe ich für die Aes-Geschichten schon 2 Wege ausprobiert, AesEncrypt und AesEncrypt2 bzw. AesDecpypt und AesDecrypt2... mit beiden gibts so seine Probleme...
Angefangen bei der ersten Version:
hier erhalte ich bei der TransformBlock()-Methode eine Cryptographic Exception, mit der Meldung "Input buffer contains insufficient data"... würd ich ja verstehen, wenn mein input buffer nicht genau 16 byte groß wär, was ja genau der Aes-Blocklänge entspricht.
Bei der zweiten Version:
bei der Entschlüsselung ist nach cs.Read() das Array decryptedData leer, bzw. mit 0 gefüllt, wie man's sieht...
außerdem erhöht sich beim Verschlüsseln die Länge von encryptedData nach dem Aufruf encryptedData = data.ToArray() von 16 auf 32... das passiert nich, wenn ich cs.FlushFinalBlock() weglasse, was aber nichts an dem Problme beim Entschlüsseln ändert...
die Aes-Blocklänge steht auf 128 (=16 byte), meine Arrays sind garantiert 16 byte groß...
Ich hoffe ihr könnt mir irgendwie helfen, ich weiß jetzt echt nicht mehr weiter...
Bevor ichs noch vergess: Ich entwickel mit dem .net Framework 1.1, höher geht leider nicht...
Danke schonmal und viele Grüße,
silversurger