java - 在 Node 中加密文件并使用 "AES/GCM/NoPadding"在 java 中解密。基本上 AES/GCM/NoPadding 等价于 Node.js

标签 java node.js encryption cryptojs

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

我尝试过使用 crypto,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);

关于java - 在 Node 中加密文件并使用 "AES/GCM/NoPadding"在 java 中解密。基本上 AES/GCM/NoPadding 等价于 Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54024763/

相关文章:

javascript - 查看对象引用的工具

c++ - Crypto API RSA 公钥可以解密数据,不是预期的不对称

java - Apache Struts 和 Java EE 之间的区别?

Java HTTP Servlet 重复提交

java - 从 IType 实例化对象

C++ - Xcode 程序

c# - 解密响应仍然看起来编码错误

java - Struts2参数到javascript

javascript - 定义对象内联属性

javascript - 访问路由、发送错误警报和重定向