我正在尝试执行AES CBC加密,URL查询字符串的填充为零。我正在使用nodejs的核心密码模块。用于http://www.blackoutrugby.com/game/help.documentation.php#category=35
我有一个键和iv。当测试以下函数时,我不会得到完整返回的字符串。我相信这与填充物有关,但不确定如何正确使用。
如果是填充物,有人能告诉我该如何使用吗?如果不是我错在哪里?在这个用户案例中,cipher.final()也很重要吗?
更新:
我现在已经包含了cipher.final(),它可以很好地处理二进制格式,但是base64给出了截断的结果。https://github.com/denishoctor/BlackoutRugbyNode/blob/master/crypto2.js是我的完整示例代码。下面是加密函数:

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('')
   };
}

谢谢,
丹尼斯

最佳答案

您没有将cipher.final返回的密文放入解密程序。这是一个简单的例子。您需要收集对cipher.update和cipher.final的每次调用的返回值,并确保将这些对象中的每一个放入decripher.update中。
更新:这里有一个版本可以使用binaryhex作为密码文本的编码,但是使用base64失败。我不知道这是为什么,但如果你与十六进制应该工作良好。
更新2:看来base64是节点本身的一个bug。见this answer to a similar question

    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(''));

关于encryption - 这个简单的NodeJS加密函数怎么了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5977865/

10-12 01:53