【发布时间】:2018-11-28 01:36:04
【问题描述】:
我正在尝试在 NodeJs 中解密。它在 Java 中工作。但我无法在 Node 中实现相同的目标。
节点版本:8.4
请找到我的 NodeJs 代码:
var crypto = require('crypto');
function decryption (message, key) {
var messageArray = Buffer.from(message, 'base64');
// var kekbuf = Buffer(key, 'utf8');
var ivBuffer = new Buffer([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);
var iv = ivBuffer.slice(0, 16);
var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
decipher.setAutoPadding(false);
var dec = decipher.update(messageArray, 'base64');
dec += decipher.final();
return dec.toString();
}
请找到有效的 Java 解密代码
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
class Test1 {
public String decrypt(String message, String key) throws Exception {
DatatypeConverter dtc = null;
byte[] messagArray = dtc.parseBase64Binary(message);
byte[] keyArray = dtc.parseBase64Binary(key);
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKey secretKey = new SecretKeySpec(keyArray, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
return new String(cipher.doFinal(messagArray));
}
}
我得到一个不同的解密文本。我无法在 NodeJs 中获得与在 Java 中相同的结果。 此外,我无法修改我的 java 加密代码。所以我必须弄清楚Node中的解密。
你能帮我解决这个问题吗?
【问题讨论】:
-
在 java 代码中,您正在解析 base64 键
dtc.parseBase64Binary(key);,而 nodejs 代码中似乎缺少该步骤。 -
谢谢,能否提供节点代码sn-p。
-
NodeJS 代码
setAutoPadding(false)表示没有填充,要加密的数据必须是块大小的精确倍数(AES 为 16 字节)。但是 Java 代码指定:"AES/CBC/PKCS5PADDING"指定填充(实际上是 PKCS#7)所以两者不兼容。
标签: java node.js encryption aes