java - java中的AES加密和使用CryptoJS的javascript中的解密
问题描述
我有下面的代码通过使用 AES/CTR/NOPADDING 模式加密 java 中的一些文件内容。我正在使用 javax 的加密包。我也使用相同的密钥来生成密钥和 iv。
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
byte[] secretKey = Base64.decodeBase64("uQsaW+WMUrjcsq1HMf+2JQ==");
SecretKeySpec key = new SecretKeySpec(secretKey, "AES");
IvParameterSpec iv = new IvParameterSpec(secretKey);
cipher.init(mode, key , iv);
FileInputStream fileInputStream = new FileInputStream(sourceFilePath);
FileOutputStream fileOutputStream = new FileOutputStream(destFilePath);
int read = 0;
while ((fileInputStream.available()) > 0) {
byte[] block = new byte[4096];
read = fileInputStream.read(block);
byte[] writeBuffer = cipher.update(block);
fileOutputStream.write(writeBuffer, 0, read);
}
byte[] writeBuffer = cipher.doFinal();
fileOutputStream.write(writeBuffer, 0, writeBuffer.length);
fileInputStream.close();
fileOutputStream.close();
我无法使用 cryptojs 解密 javascript 中的加密内容。这是我尝试过的东西。
var key = CryptoJS.enc.Hex.parse(atob('uQsaW+WMUrjcsq1HMf+2JQ=='));
var decrypted = CryptoJS.AES.decrypt(encryptedContent, key, {
mode: CryptoJS.mode.CTR,
iv: key,
padding: CryptoJS.pad.NoPadding
});
var decryptedText = CryptoJS.enc.Utf8.stringify(decrypted);
有人可以告诉我我做错了什么吗?或者告诉我怎么做。
我能够独立地在 java 和 javascript 中加密和解密。
解决方案
在
CryptoJS
-documentation中解释了 -method 需要哪些数据类型和参数CryptoJS.decrypt()
以及哪些编码器可用:- 密钥必须
CryptoJS.decrypt()
作为WordArray
. 由于 key-data 是 Base64 编码的,因此可以WordArray
使用CryptoJS.enc.Base64.parse()
-method 将它们转换为 a。 - 密文可以作为-object内部的a传递给
CryptoJS.decrypt()
-method 。Java 代码将加密数据存储在文件中。假设字符串包含那些作为十六进制字符串的数据(不幸的是,这不会从发布的代码中出现,因此必须在这里做出假设),它们可以使用 - 方法转换为 a并包装在-object 中。WordArray
CipherParams
encryptedContent
WordArray
CryptoJS.enc.Hex.parse()
CipherParams
- -
CryptoJS.decrypt()
方法返回一个WordArray
可以用CryptoJS.enc.Utf8.stringify()
- 方法转换成字符串的值。
- 密钥必须
如果输入文件中包含以下纯文本:
This is the plain text which needs to be encrypted!
Java 代码在输出文件中存储以下字节序列(= 加密数据):
52F415AB673427C42278E8D6F34C16134D7E3FE7986500980ED4063F3CF51162592CE0F5412CCA0BC2DBAE3F2AEC2D585EE8D7
用于解密的 JavaScript 代码是:
var key = CryptoJS.enc.Base64.parse('uQsaW+WMUrjcsq1HMf+2JQ=='); var encryptedContent = '52F415AB673427C42278E8D6F34C16134D7E3FE7986500980ED4063F3CF51162592CE0F5412CCA0BC2DBAE3F2AEC2D585EE8D7'; var cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext: CryptoJS.enc.Hex.parse(encryptedContent) }); var decrypted = CryptoJS.AES.decrypt(cipherParams, key, { mode: CryptoJS.mode.CTR, iv: key, padding: CryptoJS.pad.NoPadding }); var decryptedText = CryptoJS.enc.Utf8.stringify(decrypted); console.log(decryptedText);
它在控制台中显示原始纯文本。要运行上面的代码,至少需要 CryptoJS-version 3.1.4(请参阅版本,cdnjs)。
推荐阅读
- firebase - Firebase 升级后 Unity Cloud Build 中出现 100 个重复类构建错误
- ros - 如何从 ROS 中的一个节点中戳出多个节点?
- kubernetes - 在 Kubernetes Ingress 从 v1beta1 切换到 v1 时,在 io.k8s.api.networking.v1.IngressBackend 中出现错误“未知字段“serviceName”
- ruby - 如何使用 nokogiri 在 wikitable 中刮取字符文字?
- python - 总结numpy数组中的非零元素
- python - 在python中声明一个变量更好:= None,或= str(),或=“”?
- windows - 区分批处理文件中的文件和目录:
- flutter - Flutter 包含总是返回 true
- kotlin - Ktor 1.4.1 不支持 EmbeddedServer(engine, port, host) 形式
- python - Python os.listdir() 返回 $RECYCLE.BIN