这几天被一个问题困扰着。
Nodejs的AES加密和Java,C#加密出来的不一致。当然,这样就不能解密了。
纠结了许久:后来还是实在不行了,看了下源代码,要不然还得继续纠结下去。
网上说,通常的nodejs AES和其他语言实现不一样。好吧~~或许吧。
nodejs的crypto模块。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
var
crypto = require( ‘crypto‘ );
var
data = "156156165152165156156" ;
console.log( ‘Original cleartext: ‘
+ data);
var
algorithm = ‘aes-128-ecb‘ ;
var
key = ‘78541561566‘ ;
var
clearEncoding = ‘utf8‘ ;
//var cipherEncoding = ‘hex‘;
//If the next line is uncommented, the final cleartext is wrong.
var
cipherEncoding = ‘base64‘ ;<br> /*加密*/
var
cipher = crypto.createCipher(algorithm, key);
var
cipherChunks = [];
cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));
cipherChunks.push(cipher.final(cipherEncoding));
console.log(cipherEncoding + ‘ ciphertext: ‘
+ cipherChunks.join( ‘‘ ));
/*解密*/ var
decipher = crypto.createDecipher(algorithm, key);
var
plainChunks = [];
for
( var
i = 0;i < cipherChunks.length;i++) {
plainChunks.push(decipher.update(cipherChunks[i], cipherEncoding, clearEncoding));
}
plainChunks.push(decipher.final(clearEncoding));
console.log( "UTF8 plaintext deciphered: "
+ plainChunks.join( ‘‘ ));
|
的确,没错~~加密解密成功。但是和java,C#中加密出来的不一样啊。神啊。
我想,大家都在这里纠结着吧~~对不对。其实只要加个向量,就可以和一致了。网上搜索出来的资源太少。才让自己纠结那么久。好吧,正确代码是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
var
crypto = require( ‘crypto‘ );
var
data = "156156165152165156156" ;
console.log( ‘Original cleartext: ‘
+ data);
var
algorithm = ‘aes-128-ecb‘ ;
var
key = ‘78541561566‘ ;
var
clearEncoding = ‘utf8‘ ;
var
iv = "" ;
//var cipherEncoding = ‘hex‘;
//If the next line is uncommented, the final cleartext is wrong.
var
cipherEncoding = ‘base64‘ ;
var
cipher = crypto.createCipheriv(algorithm, key,iv);
var
cipherChunks = [];
cipherChunks.push(cipher.update(data, clearEncoding, cipherEncoding));
cipherChunks.push(cipher.final(cipherEncoding));
console.log(cipherEncoding + ‘ ciphertext: ‘
+ cipherChunks.join( ‘‘ ));
var
decipher = crypto.createDecipheriv(algorithm, key,iv);
var
plainChunks = [];
for
( var
i = 0;i < cipherChunks.length;i++) {
plainChunks.push(decipher.update(cipherChunks[i], cipherEncoding, clearEncoding));
}
plainChunks.push(decipher.final(clearEncoding));
console.log( "UTF8 plaintext deciphered: "
+ plainChunks.join( ‘‘ ));
|
对比发现,加密出来是一致的。好吧,结贴~~~我恨你,浪费了我一天时间。