节点加密aes-128-ecb加密并没有得到正确的结果

时间:2017-07-21 14:09:28

标签: python node.js openssl aes

在python中执行以下程序:

from Crypto.Cipher import AES
key = '11223344556677889900aabbccddeeff'.decode("hex")
aesECB = AES.new(key, AES.MODE_ECB)
ciphertext = aesECB.encrypt('1234567890abcdef')
print ciphertext.encode('base64')

给我这个结果:

$ python example_cipher.py 
r9yD3EmmAIpxncxZSldsKg==

按照openssl的命令行,得到相同的结果:

$ echo -n "1234567890abcdef" | openssl aes-128-ecb -K 11223344556677889900aabbccddeeff -nopad | openssl base64
r9yD3EmmAIpxncxZSldsKg==

但节点中的这段代码:

var crypto = require('crypto');
var key = new Buffer('11223344556677889900aabbccddeeff', 'hex');
var plaintext = new Buffer('1234567890abcdef', 'utf8');
var cipher = crypto.createCipher("aes-128-ecb", key);
cipher.setAutoPadding(false);
var ciphertext = cipher.update(plaintext, 'utf8');
console.log(ciphertext.toString('base64'));

没有给我相同的结果:

$ node cipher
tOunZRvle8B6HYuBSzblqw==

错误在哪里?

1 个答案:

答案 0 :(得分:2)

首先,如果您控制加密参数,不要使用ECB。它非常不安全,不应该用于加密数据。

现在对于技术上不使用IV的ECB,您仍然需要使用crypto.createCipheriv()使用零长度IV Buffer来匹配Python的输出:

var cipher = crypto.createCipheriv("aes-128-ecb", key, Buffer.alloc(0));

另外(一般情况下),您缺少cipher.final()以包含任何剩余数据,因此请改用:

var ciphertext = Buffer.concat([
  cipher.update(plaintext, 'utf8'),
  cipher.final()
]);