节点encryptionaes256-cbc 0x0填充的例子

从节点密码文件 :

“你可以禁止自动填充input数据来阻塞大小,如果auto_padding为false,那么整个input数据的长度必须是密码块大小的倍数,否则final将会失败。非标准填充很有用,例如使用0x0而不是PKCS填充,你必须在cipher.final之前调用它。

哪一个都很好,但是,我无法在任何地方find合适的例子:

这是我的想法:

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()方法应该删除填充,但是它也不会,我也许应该填充它而不是字符。

此外,模数函数失败的string大于256 耸肩

什么是使用节点密码自定义填充(0x0)的正确方法?

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

以下是我可能会觉得有用的代码:

 //I'm expecting a utf8 encoded string function customPadding(str) { str = new Buffer(str,"utf8").toString("hex"); var bitLength = str.length*8; if(bitLength < 256) { for(i=bitLength;i<256;i+=8) { str += 0x0; } } else if(bitLength > 256) { while((str.length*8)%256 != 0) { str+= 0x0; } } return new Buffer(str,"hex").toString("utf8"); } 

您可以使用以下方式:

 function encrypt(str) { var cipher = crypto.createCipheriv('aes-256-cbc', key, iv).setAutoPadding(false); str = customPadding(str); var crypt = cipher.update(str, 'utf8', 'base64'); crypt += cipher.final("base64"); return crypt; } var t = encrypt("dude");