Encryption 这个简单的NodeJS加密函数有什么问题?

Encryption 这个简单的NodeJS加密函数有什么问题?,encryption,node.js,aes,Encryption,Node.js,Aes,我正在尝试使用url查询字符串的零填充来执行AES CBC加密。我正在使用NodeJS的核心加密模块。这是和你一起用的 我有一个键和IV。当测试以下函数时,我没有得到完整返回的字符串。我相信这与填充有关,但我不确定如何正确应用它 如果是填充物,有人能告诉我应该如何使用它吗?如果不是,我错在哪里?cipher.final在这个用户案例中也是重要的吗 更新: 我现在已经包括了cipher.final和二进制格式,但base64给出了截断的结果。这是我的完整示例代码。以下是加密功能: function

我正在尝试使用url查询字符串的零填充来执行AES CBC加密。我正在使用NodeJS的核心加密模块。这是和你一起用的

我有一个键和IV。当测试以下函数时,我没有得到完整返回的字符串。我相信这与填充有关,但我不确定如何正确应用它

如果是填充物,有人能告诉我应该如何使用它吗?如果不是,我错在哪里?cipher.final在这个用户案例中也是重要的吗

更新: 我现在已经包括了cipher.final和二进制格式,但base64给出了截断的结果。这是我的完整示例代码。以下是加密功能:

function cryptoTest(data, key, iv, format) {
   var cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
   var cipherChunks = [];
   cipherChunks.push(cipher.update(data, 'utf8', format));
   cipherChunks.push(cipher.final());

   var decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
   var plainChunks = [];
   for (var i = 0;i < cipherChunks.length;i++) {
        plainChunks.push(decipher.update(cipherChunks[i], format, 'utf8'));
   }
   plainChunks.push(decipher.final());

   return {
       "encrypted": cipherChunks.join(''),
       "decrypted": plainChunks.join('')
   };
}
谢谢,
Denis

您没有将cipher.final返回的密文放入解密程序。这里有一个简化的例子。您需要收集对cipher.update和cipher.final的每次调用的返回值,并确保这些对象中的每一个都被放入decipher.update中

更新:这里有一个版本可以使用二进制或十六进制作为密码文本的编码,但是使用base64失败。我不知道这是为什么,但如果你是与十六进制的工作应该很好

更新2:看起来base64是节点本身的一个bug。看


标准加密包仅支持PKCS7填充。您必须禁用Node.js标准加密包的自动填充,然后才能将代码写入填充

您可以使用以下软件包中的填充算法


谢谢你。这是一个很大的帮助。然而,当我添加base64编码时,我得到了一个截断的结果!你知道为什么吗?>原始源代码混合了输出编码base64和二进制。那是我的猜测。让我用一致的base64试试我的例子。我现在更新了这个问题,有了一个完整的例子@Well,只需加密为十六进制,然后在节点加密库之外将十六进制转换为base64。使用节点库、第三方库,甚至作为最后手段分叉子流程都应该很简单……或者……只需修复节点错误即可:-P
    var crypto = require('crypto');

    var data = "I am the clear text data";
    console.log('Original cleartext: ' + data);
    var algorithm = 'aes-128-cbc';
    var key = 'mysecretkey';
    var clearEncoding = 'utf8';
    var cipherEncoding = 'hex';
    //If the next line is uncommented, the final cleartext is wrong.
    //cipherEncoding = 'base64';
    var cipher = crypto.createCipher(algorithm, key);
    var cipherChunks = [];
    cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));
    cipherChunks.push(cipher.final(cipherEncoding));
    console.log(cipherEncoding + ' ciphertext: ' + cipherChunks.join(''));
    var decipher = crypto.createDecipher(algorithm, key);
    var plainChunks = [];
    for (var i = 0;i < cipherChunks.length;i++) {
      plainChunks.push(decipher.update(cipherChunks[i], cipherEncoding, clearEncoding));

    }
    plainChunks.push(decipher.final(clearEncoding));
    console.log("UTF8 plaintext deciphered: " + plainChunks.join(''));