Próbuję przekonwertować ten kod C# do Pythona (2.5, GAE). Problem polega na tym, że zaszyfrowany łańcuch ze skryptu Pythona jest inny za każdym razem, gdy uruchamiane jest szyfrowanie (w tym samym łańcuchu).Python do C# AES CBC PKCS7
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));
}
kod Pythona (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)
C# kod jest dziedziczona. Kod Pythona musi być szyfrowany i odszyfrowywany w ten sam sposób, aby kod C# mógł poprawnie zdekodować wartość.
Uwaga: jestem noobem w Pythonie :)
Edit: Przepraszam. Powinien był rozróżnić, że jest wywoływana funkcja.
Dzięki!
Czy wiesz, jak działa tryb IV/CBC? Jeśli za każdym razem uruchamiasz ten kod pośredniczący, powinien on wytwarzać to samo wyjście dla tego samego wejścia. Jeśli jednak wielokrotnie wywołasz encryptor.encrypt z tym samym wejściem bez ponownego inicjowania szyfrowania (aby zresetować go do tego samego stanu początkowego), za każdym razem będzie generował inny wynik. – Foon
Czy moja edycja zmienia Twój komentarz? jeśli nie, jaki jest najlepszy sposób, aby to naprawić? – Eonasdan
naprawiono przez przeniesienie: encryptor = AES.new (klawisz, tryb, iv) do funkcji. Dzięki @Foon – Eonasdan