Node加密解密编码问题

编写了一个node的加密解密demo,遇到编码问题,关于加密与解密分别使用的是createCipherivcreateDecipheriv方法

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/ 这样的乱码?

阅读 7.1k
1 个回答

AES-128-CBC顾名思义,就是128位密钥的AES分组密码,CBC是指加密时使用的加密模式是密码分组链模式。

AES的加密流程这个百度上都有,懒得抄了,IV是initial Value,用于首次加密前初始化分组的,16个字节,128位。

UTF8是一个字符编码,AES加密完的东西是一串不可预测的二进制码,你强行套一个字符编码的话当然编码出来的都是乱码,Base64不是字符编码,是一种二进制位转换成可打印字符的编码方式,所以你觉得很正常,因为他本来就只有那64个字符可以打印,Hex16就是16个字符可以打印,都没有乱码,所以没毛病

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题