4 Stimmen

Verschlüsseln von Daten mit C# AesCryptoServiceProvider verschlüsselt mit BouncyCastle AesFastEngine

Ich muss Daten mit Standard C# AesCryptoServiceProvider entschlüsseln, die mit Bouncy Castle AesFastEngine auf der Java-Seite verschlüsselt wurden. (Um die Daten mit der c#-Implementierung von Bounca Castle zu entschlüsseln ist kein Problem)

Gibt es eine Möglichkeit, dies zu tun?

Ich finde den IV nicht, der in der Bouncy Castle-Implementierung verwendet wird... Gibt es einen?

Über jede Hilfe würde ich mich sehr freuen! Markus

EDIT:

Der folgende Code wird zur Initialisierung der AesFastEngine verwendet:

BlockCipher coder = new AESFastEngine();
CFBBlockCipher cfbCipher = new CFBBlockCipher(coder, 8);
StreamCipher streamCipher = new StreamBlockCipher(cfbCipher);
streamCipher.Init(true, keyParameter);
streamCipher.ProcessBytes(data, 0, data.Length, encodedMessageBytes, 0);

EDIT:

Hallo Grec, danke für deine Antwort, aber es funktioniert immer noch nicht... Ich habe eine Beispiellösung zum Herunterladen aquí .

Wenn Sie auf die beiden Buttons klicken, erhalten Sie bereits ein anderes verschlüsseltes Feld...? Das Entschlüsseln des mit bouncy castle erzeugten Arrays führt zu einer Ausnahme, die besagt, dass die verschlüsselten Daten eine ungültige Länge haben...

Hier ist der Code, den ich für die Entschlüsselung geschrieben habe:

AesManagedAlg = new AesManaged();
AesManagedAlg.Mode = CipherMode.CBC;
AesManagedAlg.FeedbackSize = 8;
AesManagedAlg.Key = key;
// Use Test
AesManagedAlg.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 

// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = AesManagedAlg.CreateDecryptor(AesManagedAlg.Key, AesManagedAlg.IV);

// Create the streams used for decryption.
msDecrypt = new MemoryStream(cipherText);
csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);

// Read the decrypted bytes from the decrypting stream
var decryptedData = new List<byte>();
var buffer = new byte[1];
while (true) {
    var readedBytes = csDecrypt.Read(buffer, 0, buffer.Length);
    if(readedBytes == 0) break;
    decryptedData.Add(buffer[0]);
}
ret = decryptedData.ToArray();

Bearbeiten:

Es wird eng! RijndaelManaged managed funktioniert, aber es gibt mir ein Byte mehr an verschlüsselten Daten. Alle anderen Bytes sind die gleichen... Ich habe viel versucht, aber ich weiß nicht, wie ich das letzte Byte mit Bouncy Castle bekommen kann... Ohne dieses letzte Byte ist es nicht möglich, die Daten mit RijndaelManaged zu entschlüsseln...

1voto

Der von Ihnen verwendete IV ist der Standard-IV, alle Nullen. Sie sollten in der Lage sein, dies in .NET zu tun, indem Sie eine AesManaged Objekt, wobei der Modus auf CipherMode.CFB und setzen die FeedbackSize auf 8. Verwenden Sie dann die CreateEncryptor Methode zur Erstellung einer ICryptoTransform und verwenden diese wiederum zur Erstellung einer CryptoStream . Dieses Beispiel sollte bei den letzten Schritten helfen.

EDIT:

Wenn ich mir den neuen Code ansehe, den Sie gepostet haben, ist die zweite Zeile falsch. Sie müssen angeben CFB Modus, no CBC . Die zweite Zeile sollte lauten

AesManagedAlg.Mode = CipherMode.CFB;

Außerdem sieht es so aus, als entschlüsselten Sie readedBytes Bytes von Daten, sondern nur das Hinzufügen buffer[0] auf den Klartext zu übertragen und den Rest zu ignorieren.

EDIT 2:

Wie erwähnt, AesManaged kann nicht im CFB-Modus verwendet werden, aber RijndaelManaged kann es. Beachten Sie, dass der AES-Algorithmus lediglich der Rijndael-Algorithmus ist, der auf eine Blockgröße von 128 Bit und eine Schlüsselgröße von entweder 128, 192 oder 256 Bit beschränkt ist. Siehe meine Antwort zu einer ähnlichen Frage für ein Beispiel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X