编写了一个node的加密解密demo,遇到编码问题,关于加密与解密分别使用的是createCipheriv
与createDecipheriv
方法
node版本
$ node -v
v8.11.3
代码编辑使用的Sublime Text 3 编码为 UTF-8
终端编码格式为 UTF-8
相关代码
let crypto = require('crypto');
let algorithm = 'aes-128-cbc';
let key = '9cd5b4cf89949207';
let iv = 'e6db271db12d4d47';
let data = 'hello world';
// 输入编码
let inputEncoding = 'utf8';
// 输出编码
let outputEncoding = 'hex';
let cipher = (algorithm, key, iv, data, callback) => {
let cip = crypto.createCipheriv(algorithm, key, iv);
let ciphertext = cip.update(data, inputEncoding, outputEncoding) + cip.final(outputEncoding);
callback(ciphertext);
};
let decipher = (algorithm, key, iv, ciphertext, callback) => {
let decip = crypto.createDecipheriv(algorithm, key, iv);
let data = decip.update(ciphertext,outputEncoding,inputEncoding) + decip.final(inputEncoding);
callback(data);
};
cipher(algorithm, key, iv, data, (ciphertext) => {
console.log(ciphertext);
decipher(algorithm, key, iv, ciphertext, (data) => {
console.log(data);
})
})
你期待的结果是什么?实际看到的错误信息又是什么?
1,设置输入编码与输出编码都为UTF-8
时,终端运行出错
let inputEncoding = 'utf8';
let outputEncoding = 'utf8';
输出结果如下
$ node temp.js
49��cY~�B�iU/
crypto.js:183
var ret = this._handle.final();
^
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Decipheriv.final (crypto.js:183:26)
at decipher (/Users/lkp/Desktop/NodeS/temp.js:19:78)
at cipher (/Users/lkp/Desktop/NodeS/temp.js:24:5)
at cipher (/Users/lkp/Desktop/NodeS/temp.js:15:5)
at Object.<anonymous> (/Users/lkp/Desktop/NodeS/temp.js:22:1)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
2 设置输入编码为utf8
,输出编码为base64
let inputEncoding = 'utf8';
let outputEncoding = 'base64';
结果如下
ND0IOZDkqGNZfrxCnmlVLw==
hello world
3,设置输入编码为utf8
,输出编码为hex
let inputEncoding = 'utf8';
let outputEncoding = 'hex';
结果如下
343d083990e4a863597ebc429e69552f
hello world
两个问题
1,aes-128-cbc 这样的加密算法对应的 key 以及 iv 的长度是怎么确定的,key 与 iv分别在加密中起到了什么作用?
2,输出编码为utf8
时,为什么输出的是 49��cY~�B�iU/
这样的乱码?
AES-128-CBC
顾名思义,就是128位密钥的AES分组密码,CBC是指加密时使用的加密模式是密码分组链模式。AES的加密流程这个百度上都有,懒得抄了,IV是initial Value,用于首次加密前初始化分组的,16个字节,128位。
UTF8是一个字符编码,AES加密完的东西是一串不可预测的二进制码,你强行套一个字符编码的话当然编码出来的都是乱码,Base64不是字符编码,是一种二进制位转换成可打印字符的编码方式,所以你觉得很正常,因为他本来就只有那64个字符可以打印,Hex16就是16个字符可以打印,都没有乱码,所以没毛病