节点加密aes256-cbc 0x0填充示例

时间:2014-02-18 14:32:58

标签: node.js cryptography aes padding

来自节点密码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)的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

好的,经过一点点的修补,我得到了整个工作。

以下是我可能认为有用的代码:

已更新2019 /节点10.15.0

节点crypto将为您处理填充。

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