如何在Nodejs上解密Java AES"/>
如何在Nodejs上解密Java AES
我在Java上具有以下用于解密AES加密的代码,我需要在Node.js上执行相同的操作
private static SecretKeySpec secretKey;
private static byte[] key;
public static void setKey(String myKey) {
MessageDigest sha = null;
try {
key = myKey.getBytes("UTF-8");
sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
secretKey = new SecretKeySpec(key, "AES");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String decrypt(String strToDecrypt, String secret)
{
try
{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
}
catch (Exception e)
{
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
我曾尝试在以下代码下使用Crypt,但结果却不尽相同
var aesDecrypt = (text, password, bit) => {
var decipher = crypto.createDecipheriv('aes-' + bit + '-ecb', password, Buffer.alloc(0));
decipher.setAutoPadding(false);
return Buffer.concat([
decipher.update(text, 'base64'),
decipher.final()
]).toString();
};
我如何将上述Java代码从上面模仿到Node.js中?
回答如下:正如James所说,Java代码正在对密码进行哈希处理(并截断)以形成密钥。此外,它[[does使用标准填充。以下用于ASCII数据:
const crypto = require ('crypto');
const mydecrypt = (pw,ctx) => {
var h = crypto.createHash('sha1'); h.update(pw,'utf8'); var k = h.digest().slice(0,16);
var d = crypto.createDecipheriv('aes-128-ecb', k, Buffer.alloc(0));
return Buffer.concat([d.update(ctx,'base64'), d.final()]) .toString();
}
console.log(mydecrypt('password','ks7qtmk7kt5riV/Qyy3glQ=='));
->
testdata
可能不适用于非ASCII数据。 Javanew String(byte[])
使用依赖于JVM的编码,该编码可以是UTF8,也可以是不同的,具体取决于您的平台,内部版本和环境,而您没有描述。 OTOH nodejsBuffer.toString()
始终使用UTF8。您可能需要将其更改为toString(somethingelse)
以匹配Java。
更多推荐
如何在Nodejs上解密Java AES
发布评论