【发布时间】:2018-02-16 15:22:33
【问题描述】:
我正在尝试在 nodejs 中进行编码,并且在 nodejs 中进行相同的解密效果很好。但是,当我尝试使用相同的 IV 和秘密在 Java 中进行解密时,它的行为并不符合预期。
这里是sn-p的代码:
nodeJs 中的加密:
var crypto = require('crypto'),
algorithm = 'aes-256-ctr',
_ = require('lodash'),
secret = 'd6F3231q7d1942874322a@123nab@392';
function encrypt(text, secret) {
var iv = crypto.randomBytes(16);
console.log(iv);
var cipher = crypto.createCipheriv(algorithm, new Buffer(secret),
iv);
var encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
return iv.toString('hex') + ':' + encrypted.toString('hex');
}
var encrypted = encrypt("8123497494", secret);
console.log(encrypted);
输出是:
<Buffer 94 fa a4 f4 a1 3c bf f6 d7 90 18 3f 3b db 3f b9>
94faa4f4a13cbff6d790183f3bdb3fb9:fae8b07a135e084eb91e
在 JAVA 中用于解密的代码片段:
public class Test {
public static void main(String[] args) throws Exception {
String s =
"94faa4f4a13cbff6d790183f3bdb3fb9:fae8b07a135e084eb91e";
String seed = "d6F3231q7d1942874322a@123nab@392";
decrypt(s, seed);
}
private static void decrypt(String s, String seed)
throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, InvalidKeyException,
InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
String parts[] = s.split(":");
String ivString = parts[0];
String encodedString = parts[1];
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
byte[] secretBytes = seed.getBytes("UTF-8");
IvParameterSpec ivSpec = new IvParameterSpec(hexStringToByteArray(ivString));
/*Removed after the accepted answer
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(secretBytes);*/
SecretKeySpec skey = new SecretKeySpec(thedigest, "AES");
cipher.init(Cipher.DECRYPT_MODE, skey, ivSpec);
byte[] output = cipher.doFinal(hexStringToByteArray(encodedString));
System.out.println(new String(output));
}
}
输出:�s˸8ƍ�
我在响应中得到了一些垃圾值。尝试了很多选项,但似乎没有一个有效。任何线索/帮助表示赞赏。
【问题讨论】:
-
嗯...您正在输出用 NodeJS 编码的 IV 和密文十六进制。您正在用 Java 打印原始输出。为什么您期望它们是相同的?我觉得您没有编写此代码,您只是从某个地方复制并粘贴它而没有尝试理解它。
-
@LukeJoshuaPark:Java 代码用于解密;它应该产生与 JS 加密代码的 input 相同的输出,这是一个纯(非十六进制)文本字符串。无论如何,我已经验证了 JS 代码的输出可以使用
openssl enc命令行工具解密(这并不奇怪,因为 node.js 加密模块是基于 OpenSSL 的),所以错误(和/或标准不匹配)必须在 Java 端。 -
@ManojBhardwaj:这个问题及其答案已有两年半的历史了。它们的副本已经传播到许多 SO 镜像站点和档案馆,您永远不会将它们全部更改。关键是要在网络上留下来,而你试图编辑它所做的只是吸引更多的注意力。我建议您尽快更改项目中的密钥。
标签: java node.js security encryption cryptography