繁体   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