来自节点密码documentation:
“您可以禁用输入数据的自动填充到块大小。如果auto_padding为false,则整个输入数据的长度必须是密码块大小的倍数,否则最终将失败。对于非标准填充非常有用,例如,使用0x0而不是PKCS填充。你必须在cipher.final之前调用它。“
哪个都很好,但是,我无法在任何地方找到合适的例子:
以下是我对这种方式的看法:
function pad(str) {
if((str.length*8)%256 != 0) {
str+= "0";
pad(str);
}
}
var str = "blah_blah_blah_blah_ asdf";
if(byteLength < 256) {
for(i=byteLength;i<256;i+=8) {
str += "0";
}
} else if(byteLength > 256) {
pad(str);
}
现在这显然不理想,因为cipher.final()方法应该删除填充, 但是,它也不会,我应该用六角而不是字符填充它。
此外,模数函数在大于256 耸肩
的字符串上失败在节点加密时使用自定义填充(0x0)的正确方法是什么?
答案 0 :(得分:3)
好的,经过一点点的修补,我得到了整个工作。
以下是我可能认为有用的代码:
const crypto = require("crypto");
const iv = crypto.randomBytes(16);
let key = crypto.randomBytes(32);
function encrypt(str) {
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let crypt = cipher.update(str, 'utf8', 'base64');
crypt += cipher.final("base64");
return crypt;
}
function decrypt(str) {
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
let decrypt = decipher.update(str, 'base64', 'utf8');
decrypt += decipher.final();
return decrypt;
}
const enc = encrypt("dude5");
const dec = decrypt(enc);
console.log(enc, dec);