Ваш код C # недействителен.
Функция Encrypt
принимает парольную фразу как string passphrase
, но затем пытается сослаться на нее в этой строке byte[] pwdBytes = Encoding.UTF8.GetBytes(key);
Изменить key
на passphrase
.
Две функции теперь дают одинаковые результаты для меня:
Python
secret_text = 'The rooster crows at midnight!'
key = 'A16ByteKey......'
mode = AES.MODE_CBC
iv = '\x00' * 16
encoder = PKCS7Encoder()
padded_text = encoder.encode(secret_text)
e = AES.new(key, mode, iv)
cipher_text = e.encrypt(padded_text)
print(base64.b64encode(cipher_text))
# e = AES.new(key, mode, iv)
# cipher_text = e.encrypt(padded_text)
# print(base64.b64encode(cipher_text))
C # (сописанное выше исправление опечатки)
Console.WriteLine(Encrypt("The rooster crows at midnight!", "A16ByteKey......"));
Результат Python
XAW5KXVbItrc3WF0xW175UJoiAfonuf + s54w2iEs + 7A =
C # 1031 * C 1030*
XAW5KXVbItrc3WF0xW175UJoiAfonuf + s54w2iEs + 7A =
Я подозреваю, что вы повторно используете 'e' в коде Python несколько раз.Если вы раскомментируете последние две строки моего скрипта Python, вы увидите, что результат теперь другой.Но если вы раскомментируете последние три строки, вы увидите, что результат такой же.Как сказал Фун, это происходит из-за того, как работает CBC .
CBC (Cipher-block chaining) работает при шифровании последовательности байтов в блоках.Первый блок зашифрован путем включения IV с первыми байтами вашего открытого текста («Петух ...»).Второй блок использует результат этой первой операции вместо IV.
Когда вы вызываете e.encrypt()
во второй раз (например, раскомментируя последние две строки скрипта Python), вы выбираете, где остановились,Вместо использования IV при шифровании первого блока, он будет использовать вывод последнего зашифрованного блока.Вот почему результаты выглядят иначе.Сняв три последние строки скрипта python, вы инициализируете новый шифратор, который будет использовать IV для своего первого блока, в результате чего вы получите идентичные результаты.