Вы используете Encoding.Unicode.GetBytes(clearText)
, который возвращает UTF-16LE , в то время как Python (более разумно) по умолчанию UTF-8 для raw.encode()
. Я бы использовал Encoding.UTF8
для вашего C# кода.
Как уже упоминалось в комментариях, Python также добавляет IV перед шифротекстом, тогда как * Код 1026 * просто выполняет шифрование и вычисляет IV во время дешифрования (поэтому его не нужно хранить).
Вот программа Python, которая делает то же самое:
import base64
from Crypto.Cipher import AES
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Util.Padding import pad
class AESCipher(object):
def __init__(self, key, interactions=1000):
self.bs = AES.block_size
self.key = key
self.interactions = interactions
def encrypt(self, raw):
nbytes = [0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76,
0x65, 0x64, 0x65, 0x76]
salt = bytes(nbytes)
keyiv = PBKDF2(self.key, salt, 48, self.interactions)
key = keyiv[:32]
iv = keyiv[32:48]
cipher = AES.new(key, AES.MODE_CBC, iv)
encoded = raw.encode('utf-16le')
encodedpad = pad(encoded, self.bs)
ct = cipher.encrypt(encodedpad)
cip = base64.b64encode(ct)
return self._base64_url_safe(str(cip, "utf-8"))
def _base64_url_safe(self, s):
return s.replace('+', '-').replace('/', '_').replace('=', '')
enc = AESCipher("teste123")
dec = enc.encrypt("leandro")
print(dec)
Прежде чем кричать Эврика, пожалуйста, поймите, что зашифрованный текст, который создает код C#, не защищен целостностью и не аутентифицирован. Более того, он уязвим к атакам с отступом oracle, если они присутствуют на приемнике. Атаки с отступом oracle чрезвычайно эффективны, и вы потеряете полную конфиденциальность сообщения, если они будут применены.
Кроме того, если соль не случайна, то ключ и IV также не случайны. Это, в свою очередь, означает, что зашифрованный текст такой же случайный, как и обычный текст. Другими словами, он пропускает данные, если встречаются одни и те же блоки открытого текста. Поэтому я надеюсь, что неслучайная соль только для целей тестирования.
В конце концов, правильное шифрование не означает, что ваше решение безопасно.