最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

如何在Nodejs上解密Java AES

网站源码admin21浏览0评论

如何在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数据。 Java new String(byte[])使用依赖于JVM的编码,该编码可以是UTF8,也可以是不同的,具体取决于您的平台,内部版本和环境,而您没有描述。 OTOH nodejs Buffer.toString()始终使用UTF8。您可能需要将其更改为toString(somethingelse)以匹配Java。

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论