【问题标题】:crypto wrong AES-256-ecb encrypt加密错误 AES-256-ecb 加密
【发布时间】: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


【解决方案1】:

ECB 模式不需要 IV。但是,如果您忽略它,您将匹配this createCipher method that takes a password instead of a key方法签名。因此,您需要一些表示 IV 的对象来选择采用密钥而不是密码的方法,即使该对象随后被忽略。

不要使用一些蹩脚的在线工具测试您的代码,而是使用 NIST 测试向量。不要使用欧洲央行。另外,请务必仔细阅读 API 文档,尤其是在遇到问题之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多