我使用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/