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
InformationsquelleAutor Eonasdan | 2011-07-19
Schreibe einen Kommentar