簡體   English   中英

如何在 Nodejs 上解密 Java AES

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM