当前位置: 首页 > 知识库问答 >
问题:

在node.js中重写Java AES 256 GCM加密(PBKDF2WithHmacSHA1)

邴烨
2023-03-14

我有以下java代码用于加密纯文本:

private static final String SECRET_KEY = "SecKeyTest";
private static final String SALT = "thisIsSalt";



public String encrypt(String strToEncrypt) {
    try {
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IvParameterSpec ivspec = new IvParameterSpec(iv);

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        KeySpec spec = new PBEKeySpec(SECRET_KEY.toCharArray(), SALT.getBytes(), 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
        
        GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(128 , iv);

        Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, gcmParameterSpec);
        return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)));
    } catch (Exception e) {
        System.out.println("Error while encrypting: " + e.toString());
    }
    return null;
}
const salt = "thisIsSalt";
const digest = 'sha256';
const aesSecretKey = "SecKeyTest";

module.exports = {

    encrypt: function (plainText){

        const key = crypto.pbkdf2Sync(aesSecretKey, salt, 65536, 32, digest); //key len 32bytes i.e 256bits
        const iv = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]);

        // AES 256 GCM Mode
        var cipher = crypto.createCipheriv('aes-256-gcm', key, iv);

        // encrypt the given text
        var encrypted = Buffer.concat([cipher.update(plainText, 'utf8'), cipher.final()]);

        // extract the auth tag
        var tag = cipher.getAuthTag();

        // generate output
        return Buffer.concat([Buffer.from(salt), iv, tag, encrypted]).toString('base64');
        
    }


};

共有1个答案

虞华彩
2023-03-14

Java代码隐式地将密文和标记按此顺序连接在一起。因此,要在NodeJS代码中得到相同的结果,需要进行以下更改:

return Buffer.concat([encrypted, tag]).toString('base64');

但是,salt和IV不应该是静态的,而应该为每次密钥派生和加密随机生成。由于salt和IV是解密所需的,并且两者都不是秘密的,所以它们与密文和标签一起传递,通常也是级联的,例如:salt IV密文标签。

 类似资料:
  • 我正在使用pkcs7加密解密在当前的项目。我想从PHP改为Node.js。node.js中有pkcs7加密/解密吗? 在PHP中, 解密 node.js中有类似这样的功能吗?

  • 问题内容: 我正在通过Apache和Node.js服务器之间的不安全连接发送数据。我需要在PHP中加密数据并在Node.js中解密。我花了2天的时间使它正常工作,但是我只设法使消息签名正常工作,没有加密。我尝试将AES128-CBC,AES256-CBC,DES,AES128,AES256作为算法传递,但是效果不佳。 我在PHP中尝试过: 在Node.js中: 而且除了错误的解密数据外,我还会得到

  • 问题内容: 我一直在寻找一个解决方案,并在Node.js服务器和Objective-C客户端上进行加密,反之亦然,使用AES(或其他合适的方法)进行搜索 我对密码学还比较陌生,因此我无法理解为什么每种语言的加密文本都不同。 这是我到目前为止的内容: 使用此CryptoJS库的 Node.js加密方法 -node-cryptojs-aes 使用AESCrypt库的 Objective-C加密方法 多

  • 问题内容: 寻找一种在node中加密数据(主要是字符串)并在android应用(java)中解密的方法。 在每个节点中都成功做到了这一点(在节点中进行加密/解密,在Java中进行加密/解密),但是似乎无法使其在它们之间起作用。 可能我不是以相同的方式进行加密/解密,但是每种语言的每个库对于相同的事物都有不同的名称… 任何帮助表示赞赏。 这是一些代码:Node.js 和java 原始密钥是这样创建的

  • 问题内容: 我正在努力寻找一种 将数据写入 Node.js中 的CSV 的方法。 有几个CSV插件可用,但是它们只能“写”到stdout。 理想情况下,我想使用循环 逐行 编写。 问题答案: 对于文档()具体状态,它可以用流(见使用,)。因此,使用stdout并不是硬编码。 当您出现其他一些CSV解析器时,您可能也想看看它们。

  • 我当前在解密服务器上的RSA加密数据时遇到了问题,服务器使用Node.js并使用node-rsa库进行加密/解密。 在我的Android客户端上没有任何问题地接收到公钥,但是当尝试解密数据时,我得到了以下异常: 这就是我在客户端上生成公钥的方式 以下是客户端的加密: