Ruby与Python的AES加密差异

问题描述 投票:1回答:1

我正在尝试使用AES-256-CBC加密消息,但我在Ruby和Python版本中得到了不同的行为。看起来Python的AES加密不会添加后缀。

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"

而在使用cryptography的Python中:

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代码以便生成相同的密文?

python ruby encryption cryptography aes
1个回答
2
投票

一位朋友指出了问题:encrypt方法需要填充数据:

from Crypto.Util.Padding import pad
ct = encryptor.update(pad(data,16)) + encryptor.finalize()
© www.soinside.com 2019 - 2024. All rights reserved.