Python auf C# - AES-CBC-PKCS7 -
Ich versuche zu konvertieren, das C# - code in Python (2.5, GAE). Das problem ist, dass die verschlüsselte Zeichenfolge von dem python-Skript wird jedes mal anders die Verschlüsselung (auf derselben saite) ausgeführt.
string Encrypt(string textToEncrypt, string passphrase)
{
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
rijndaelCipher.KeySize = 128;
rijndaelCipher.BlockSize = 128;
byte[] pwdBytes = Encoding.UTF8.GetBytes(passphrase);
byte[] keyBytes = new byte[16];
int len = pwdBytes.Length;
if (len > keyBytes.Length)
{
len = keyBytes.Length;
}
Array.Copy(pwdBytes, keyBytes, len);
rijndaelCipher.Key = keyBytes;
rijndaelCipher.IV = new byte[16];
ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt);
return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));
}
Python-code: (PKCS7Encoder: http://japrogbits.blogspot.com/2011/02/using-encrypted-data-between-python-and.html)
from Crypto.Cipher import AES
from pkcs7 import PKCS7Encoder
#declared outside of all functions
key = '####'
mode = AES.MODE_CBC
iv = '\x00' * 16
encryptor = AES.new(key, mode, iv)
encoder = PKCS7Encoder()
def function(self):
text = self.request.get('passwordTextBox')
pad_text = encoder.encode(text)
cipher = encryptor.encrypt(pad_text)
enc_cipher = base64.b64encode(cipher)
Den C# - code vererbt wird. Python-code muss verschlüsselt und entschlüsselt die gleiche Weise, so dass der C# - code decodieren kann der Wert korrekt.
Hinweis: ich bin ein noob in python 🙂
Edit: tut mir Leid. sollte die Unterscheidung, dass es eine Funktion aufgerufen wird.
Dank!
- Sind Sie sich bewusst, wie ein IV / CBC-Modus funktioniert? Wenn Sie ausführen, dass die stub jeder Zeit, sollte es produzieren die gleiche Ausgabe für die gleiche Eingabe. Wenn jedoch, Sie rufen encryptor.verschlüsseln Sie mehrfach mit der gleichen input ohne Neuinitialisierung encryptor (um es zurückzusetzen, um den gleichen Ausgangszustand), wird es produzieren verschiedene Ausgabe-jedes mal.
- muss mein "Bearbeiten" ändern Sie Ihren Kommentar? wenn nicht, was ist der beste Weg, um es zu beheben?
- fixiert durch verschieben von: encryptor = AES.new(key, mode, iv) in die Funktion. Danke @Foon
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihrem C# - code ist ungültig.
Den
Encrypt
Funktion nimmt in der passphrase alsstring passphrase
aber versucht dann Verweis in diese Zeilebyte[] pwdBytes = Encoding.UTF8.GetBytes(key);
Ändern
key
zupassphrase
.Den beiden Funktionen nun identische Ergebnisse ergeben für mich:
Python
C# (mit der typo oben erwähnte Update)
Python-Ergebnis
C# Ergebnis
Ich vermute, du bist wieder mit 'e' in Ihrem python-code mehrere Male. Wenn Sie kommentieren Sie die letzten beiden Zeilen von meinem python-Skript, sehen Sie die Ausgabe ist jetzt anders. Aber wenn Sie kommentieren Sie die letzten drei Zeilen, werden Sie sehen, die Ausgabe ist die gleiche. Als Foon sagte, ist dies aufgrund wie CBC funktioniert.
CBC (Cipher block chaining) funktioniert, wenn die Verschlüsselung einer Folge von bytes in Blöcken. Der erste block wird verschlüsselt durch die Einbeziehung der IV mit den ersten bytes von Ihrem Klartext ("Der Hahn..."). Der zweite block verwendet, das Ergebnis, die erste operation statt der IV.
Beim Aufruf
e.encrypt()
ein zweites mal (z.B. durch uncommmenting die letzten zwei Zeilen von dem python-Skript), Sie abholen, wo Sie aufgehört haben. Anstelle der Verwendung der IV beim verschlüsseln des ersten Blocks zu verwenden, wird die Ausgabe von der Letzte verschlüsselte block. Dies ist der Grund, warum die Ergebnisse unterschiedlich Aussehen. Durch uncommening die letzten drei Zeilen des python-Skript initialisieren Sie eine neue encryptor die die IV für den ersten block, was Sie bekommen das gleiche Ergebnis.geändert von python-code:
falls jemand erreicht diese Seite über google
Diese esotic PKCS7-encoder ist etwas anderes dann eine Funktion, die pads mit einer statischen Länge.
So habe ich es umgesetzt mit einem sehr chip-code
Ich hoffe, dass dies helfen könnte.
Cheers
Microsoft Implementierung von PKCS7 ist ein bisschen anders als Python.
Dieser Artikel hat mir geholfen, mit diesem problem:
http://japrogbits.blogspot.com/2011/02/using-encrypted-data-between-python-and.html
Seinen code für pkcs7-Codierung und-Decodierung auf github hier:
https://github.com/janglin/crypto-pkcs7-example
Mit, dass PKCS7-Bibliothek, dieser code war für mich: