在节点中加密文件并使用 "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);
我已使用 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);