[英]How to decrypt Java AES on Nodejs
我在 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 中?
正如詹姆斯所說,Java 代碼正在散列(並截斷)密碼以形成密鑰。 它也使用標准填充。 以下適用於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 數據。 Java new String(byte[])
使用依賴於 JVM 的編碼,該編碼可能是 UTF8,也可能根據您的平台、構建和環境而有所不同,您都沒有描述。 OTOH nodejs Buffer.toString()
始終使用 UTF8。 您可能需要將其更改為toString(somethingelse)
以匹配 Java。
如果這個“密碼”真的是一個密碼,即由一個或多個人選擇甚至記住,使用一個簡單的 hash 是非常弱的,如果用於任何不重要的事情可能會被破壞; 您應該使用由有能力的人為此目的設計的基於密碼的密鑰派生 Function ,例如較舊的 (PKCS5) PBKDF2 或較新的 bcrypt、scrypt 或 argon2。 但是,這不是編程問題,在這里是題外話; it has been discussed many times and at length on https://crypto.stackexchange.com and https://security.stackexchange.com .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.