Различия в шифровании AES в Ruby и Python - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь зашифровать сообщение, используя AES-256-CBC, но в версиях Ruby и Python я получаю другое поведение.Кажется, что шифрование AES в Python не добавляет суффикс.

require 'base64'
require 'aescrypt'

key = "z\r}\xE6\xB5\xB0P:\x80D@+\x96S\xAB (\x87\xDD#3x\xB9\xF3\xB4\xE7*qTKz\xC1"
iv = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
data = "\xC7u\xE7\xB7W\xED\xE60\xCD\n\xA1\x11;\xD1\x02f\x1A\xB3\x88)\xCAR\xA6B*\xB7\x82\x86/&\x86F"

Base64.encode64(AESCrypt.encrypt_data(data, key, iv, "AES-256-CBC"))

=> "ldB7M0nr+FP6I9NiogtvysUFfUC2vIt6Hj7cwzEiUEal76Cpyc+x6RTiHgkq\n6j7n\n"

В то время как в Python используется cryptography:

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import base64
backend = default_backend()

key = "z\r}\xE6\xB5\xB0P:\x80D@+\x96S\xAB (\x87\xDD#3x\xB9\xF3\xB4\xE7*qTKz\xC1"
iv = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
data = "\xC7u\xE7\xB7W\xED\xE60\xCD\n\xA1\x11;\xD1\x02f\x1A\xB3\x88)\xCAR\xA6B*\xB7\x82\x86/&\x86F"

cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
encryptor = cipher.encryptor()
ct = encryptor.update(data) + encryptor.finalize()
base64.b64encode(ct)

=> 'ldB7M0nr+FP6I9NiogtvysUFfUC2vIt6Hj7cwzEiUEY='

Вы можете видеть, что зашифрованный текст, созданный библиотекой Ruby, имеет дополнительный16 байт.У меня также есть Java-код, который выдает тот же зашифрованный текст, что и версия RubyКод Python ведет себя странно.Как я могу изменить код Python так, чтобы он создавал один и тот же зашифрованный текст?

1 Ответ

0 голосов
/ 15 сентября 2018

Друг указал на проблему: метод encrypt требует дополненных данных:

from Crypto.Util.Padding import pad
ct = encryptor.update(pad(data,16)) + encryptor.finalize()
...