【发布时间】:2018-07-08 16:29:31
【问题描述】:
我尝试在 aes-256-ecb 中加密“aaaaaaaaaaa”
var encrypt = function(cryptkey, cleardata) {
var encipher = crypto.createCipher('aes-256-ecb', cryptkey);
return Buffer.concat([
encipher.update(cleardata),
encipher.final()
]);
}
var hex_key = [0x2A,0x46,0x29,0x4A,0x40,0x4E,0x63,0x52,0x66,0x55,0x6A,0x58,0x6E,0x32,0x72,
0x35,0x75,0x38,0x78,0x2F,0x41,0x3F,0x44,0x28,0x47,0x2B,0x4B,0x61,0x50,0x64,0x53,0x67]
var _text = new Buffer([0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61])
console.log(encrypt(hex_key,_text));
//prints
<Buffer 2c 2d 90 b3 0f ef 3d 6f 73 68 db da 72 34 9c 80>
我注意到它与此加密工具的结果不匹配 http://aes.online-domain-tools.com/link/10a8ee2gzyiHxWlCJr/
编辑:最终我阅读了文档并得到了签名错误(正如 Maarten Bodewes 建议的那样),现在我对输出有疑问:
使用 createCipheriv() AND pyCrypto (python) 输出的节点加密:
8f c9 89 36 ba 7b 16 2a a8 bc 11 a4 b4 cd e3 08
在线工具和一个 c++ 库:
ad 5f 91 18 2c ed d1 d1 db 0d ab 34 8c 1c 8b
谁是对的?
解决方案:终于搞定了,c++库和那个在线工具使用0-padding方法来填充块。不确定在节点加密和 pyCrypto 中处理填充的默认方法是什么,这就是为什么我从 4 个 aes 实现中得到 2 个不同的密文。
【问题讨论】:
-
您的
_text缓冲区只有 11 个字节长。 ECB 消耗 16 个字节。一个好的库要么(语言允许)由于静态检查而无法编译,要么在运行时抛出异常。 -
@ThomasM.DuBuisson+OP:nodejs 加密使用 OpenSSL,显然是
EVP_Cipher*例程,默认情况下为需要它的模式(如 ECB)执行 PKCS5/7 填充,因此可以正确处理任何数据长度。 -
所以执行的操作不是预期的,也不是很好。
-
是的..确实我正在寻找一个易于使用但更好的 aes c++ 实现
标签: node.js encryption cryptography aes