使用python和nodejs加密和解密

时间:2017-04-03 10:13:17

标签: python node.js encryption aes pycrypto

我正在尝试在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会产生两倍的结果?

1 个答案:

答案 0 :(得分:0)

我明白了。 这是因为Pythons的PyCrypto包和Nodes的Crypto模块的不同行为。我正在使用AES,因为它是一个块密码,所以需要数据以指定长度的块存储。

PyCrypto如果遇到不是16位块的数据则会失败。节点的加密,默认情况下将填充数据,因此数据总是以大小合适的形式存在。

为简单起见,我在上面的例子中测试了长度为16字节的数据。那么为什么结果不同呢?

Python模块默认没有填充数据,并且由于数据包含正确的长度,我们得到了预期的结果。

然而,

节点加密模块会填充数据,显然会将整个16位填充块添加到原始消息中(这听起来像是一个错误)。这就是为什么加密节点的第一部分消息对应于用Python创建的消息,另一部分就是节点加密试图加密自己的过度填充。

无论如何,为了摆脱这个错误,我只是添加了

 aes.setAutoPadding(false);

在我的encrypt()函数中。

呜。