我需要用 java 加密并用 node.js 解密。解密结果损坏。
Java代码如下:
public String encrypt(SecretKey key, String message){
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] stringBytes = message.getBytes("UTF8");
byte[] raw = cipher.doFinal(stringBytes);
// converts to base64 for easier display.
BASE64Encoder encoder = new BASE64Encoder();
String base64 = encoder.encode(raw);
return base64;
}
这是 node.js 代码:
AEse3SCrypt.decrypt = function(cryptkey, encryptdata) {
encryptdata = new Buffer(encryptdata, 'base64').toString('binary');
var decipher = crypto.createDecipher('aes-128-cbc', cryptkey);
decipher.setAutoPadding(false);
var decoded = decipher.update(encryptdata);
decoded += decipher.final();
return decoded;
}
As a key I use: "[B@4ec6948c"
The jave encrypted result is: "dfGiiHZi8wYBnDetNhneBw=="<br>
The node.js result is garbich....
- 在 java 中我使用“PKCS5Padding”。关于填充,node.js 应该做什么?我做了 setAutoPadding(false)。如果我不这样做,我会得到错误解密失败。 (仅限 node.js 版本 0.8)。
- 我试图从 java 中删除 utf8 编码以与 node.js 互补,但它没有用。
知道有什么问题吗?
最佳答案
As a key I use: "[B@4ec6948c"
这听起来很像您只是在字节数组上调用 toString()
。这并不是在字节数组中为您提供 数据 - 它只是在字节数组上调用的 Object.toString()
的默认实现。
尝试使用 Arrays.toString(key)
打印出 key 。
如果您在 node.js 代码中使用了那个损坏的键值,难怪它会返回垃圾。
I tried to remove utf8 encoding from the java in order to be complementary with the node.js
这绝对是错误的做法。相反,您应该弄清楚如何让 node.js 代码将纯文本数据解释为 UTF-8 编码文本。从根本上说,字符串是字符数据,而加密作用于二进制数据——您需要一种弥合差距的方法,而 UTF-8 是一种完全合理的方法。 node.js 中解密的初始结果应该是二进制数据,然后您可以通过 UTF-8 将其“解码”为文本。
恐怕我对填充方面的了解还不够多,无法对此发表评论。
关于java - 在 java 中加密,在 node.js 中解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12685475/