【问题标题】:Node Crypto aes-128-ecb encrypt doesnt get me right resultsNode Crypto aes-128-ecb encrypt 没有得到正确的结果
【发布时间】:2017-07-21 14:09:27
【问题描述】:

以下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==

但是Node中的这段代码:

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==

错在哪里?

【问题讨论】:

    标签: python node.js openssl aes


    【解决方案1】:

    首先,如果您可以控制加密参数,请勿使用 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()
    ]);
    

    【讨论】:

    • 它工作,但第一次给我一个错误:buffer.js:93 throw new TypeError('"value" argument must not be a number');所以我使用了Buffer.from(''),现在一切正常了!
    • 这是一个错字,我现在已经修正了。
    • 您的示例代码工作正常,但我更改了相同长度的密钥,它在行上显示为“无效密钥长度”错误:var cipher = crypto.createCipheriv("aes-128-ecb",键,Buffer.alloc(0));
    • @Nr.对于 128 位 AES 密钥,key 的长度必须为 16 个字节。确保 key 是 Buffer 和 key.length === 16。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多