我正在尝试使用url查询字符串的零填充来执行AES CBC加密。我正在使用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('')
};
}
谢谢,
丹尼斯
答案 0 :(得分:5)
您没有将cipher.final返回的密文放入解密中。这是一个简化的例子。您需要从每次调用cipher.update以及cipher.final收集返回值,并确保将每个对象放入decipher.update。
更新:这是一个版本,可以使用binary
或hex
作为密文的编码,但base64
失败。我不知道为什么会这样,但是如果你对十六进制没问题就行了。
更新2 :看起来base64
是节点本身的错误。请参阅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(''));
答案 1 :(得分:0)
https://github.com/tugrul/node-mcrypt
所以我遇到了同样的问题。我创建了绑定到mcrypt