我正在尝试在Python和Node.js应用程序之间传递数据。为此,我使用AES加密。问题是Node.js生成的加密数据是使用Python生成的加密数据的两倍。
以下是代码段。
Python 3.6
import binascii
from Crypto.Cipher import AES
key = 'key-xxxxxxxxxxxxxxxxxxZZ'
iv = '1234567812345678'
data = 'some_secret_data'
def _encrypt(data):
aes = AES.new(key, AES.MODE_CBC, iv[:16])
encrypted = aes.encrypt(data)
# encrypted = b'\xd54\xbb\x96\xd3\xbet@\x10\x01 [\reg\xaa'
encrypted_base64 = binascii.b2a_base64(encrypted)
# encrypted_base64 = b'1TS7ltO+dEAQASBbDWVnqg==\n'
encrypted_hex = binascii.hexlify(encrypted)
# encrypted_hex = b'd534bb96d3be74401001205b0d6567aa'
return encrypted_base64
output = _encrypt(data)
Node v6.10.0
let crypto = require("crypto");
let enc = require("./encryption");
var key = 'key-xxxxxxxxxxxxxxxxxxZZ';
var iv = '1234567812345678';
var data = 'some_secret_data';
var encrypted_hex = encrypt(data, 'hex');
var encrypted_base64 = encrypt(data, 'base64');
console.log(encrypted_hex);
// encrypted_hex = 'd534bb96d3be74401001205b0d6567aab4c31f7a76936598e5a1cc05385f3a91'
console.log(encrypted_base64);
// encrypted_base64 = '1TS7ltO+dEAQASBbDWVnqrTDH3p2k2WY5aHMBThfOpE='
function encrypt(msg, encoding){
var aes = crypto.createCipheriv('aes-192-cbc', key, iv);
var crypted = aes.update(msg,'utf8', encoding)
crypted += aes.final(encoding);
return crypted;
}
正如您在上面所看到的,Python生成的encrypted_hex
等于d534bb96d3be74401001205b0d6567aa
。在节点中,encrypted_hex
包含上述值+ b4c31f7a76936598e5a1cc05385f3a91
。
有谁能帮我理解这里发生了什么: 为什么Node.js会产生两倍的结果?
答案 0 :(得分:0)
我明白了。 这是因为Pythons的PyCrypto包和Nodes的Crypto模块的不同行为。我正在使用AES,因为它是一个块密码,所以需要数据以指定长度的块存储。
PyCrypto如果遇到不是16位块的数据则会失败。节点的加密,默认情况下将填充数据,因此数据总是以大小合适的形式存在。
为简单起见,我在上面的例子中测试了长度为16字节的数据。那么为什么结果不同呢?
Python模块默认没有填充数据,并且由于数据包含正确的长度,我们得到了预期的结果。
然而,节点加密模块会填充数据,显然会将整个16位填充块添加到原始消息中(这听起来像是一个错误)。这就是为什么加密节点的第一部分消息对应于用Python创建的消息,另一部分就是节点加密试图加密自己的过度填充。
无论如何,为了摆脱这个错误,我只是添加了
aes.setAutoPadding(false);
在我的encrypt()
函数中。
呜。