在节点中加密文件并使用 "AES/GCM/NoPadding" 在 java 中解密。基本上 AES/GCM/NoPadding 相当于 node.js

Encrypt a file in node and decrypt in java using "AES/GCM/NoPadding". Basically AES/GCM/NoPadding equivalent in node.js

我已使用 node.js 加密文件并在 JAVA 中解密。解密是在 JAVA 中使用 "AES/GCM/Nopadding" 算法完成的,它是第三方应用程序,因此我无法更改 JAVA 代码。 我正在使用 "aes-256-gcm"(不确定它是否等同于 "AES/GCM/Nopadding")算法对 node.js 中的文件进行加密。

我尝试过使用加密,node-forge npm 模块也尝试设置 cipher.setAutoPadding(false)。但没有运气。 你能指导我哪里错了吗?

node.js

中的代码
const
 algorithm = 'aes-256-gcm',
 randomKey = crypto.randomBytes( 32 ),
 randomIv = crypto.randomBytes( 16 );
const
 cipher = crypto.createCipheriv( algorithm, randomKey, randomIv ),
 input = fs.createReadStream( './imageTest.jpg.gz' ), //gzip image 
 output = fs.createWriteStream( './imageTest.jpg.gz.enc' );

input.pipe( cipher ).pipe( output );

在JAVA

中解密的代码
byte[] decrypt(byte[] encrptedData, byte[] key, byte[] iv) {

    GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv);
    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), ivSpec);
    return cipher.doFinal(encryptedData);
}

解密文件时,我在 cipher.doFinal(encryptedData) 步骤

收到以下错误
Caused by: javax.crypto.AEADBadTagException: Tag mismatch!
    at com.sun.crypto.provider.GaloisCounterMode.decryptFinal(GaloisCounterMode.java:571)
    at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1046)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:983)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
    at javax.crypto.Cipher.doFinal(Cipher.java:2165)

所以我需要知道如何在 node.js

中实现等效

解密完成后在NodeJs中加入这一行,获取认证标签

const tag = cipher.getAuthTag();

也传送这个标签。

还有。在 Java 部分,将其附加到 dofinal

之前
cipher.update(textBytes);