来自CryptoJS的Java解密
我正在尝试解密Java大小的一些信息,这些信息以前是用CryptoJS(angualrjs)加密的。 以下是一些代码片段: Angularjs加密来自CryptoJS的Java解密,java,angularjs,encryption,aes,Java,Angularjs,Encryption,Aes,我正在尝试解密Java大小的一些信息,这些信息以前是用CryptoJS(angualrjs)加密的。 以下是一些代码片段: Angularjs加密 CryptoJS.AES.encrypt(message, "my secret key").toString(); 在Java中解密 package com.mypackage; import java.io.UnsupportedEncodingException; import java.security.Message
CryptoJS.AES.encrypt(message, "my secret key").toString();
在Java中解密
package com.mypackage;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class AES {
private static SecretKeySpec secretKey;
private static byte[] key;
public static void setKey(String myKey) {
MessageDigest sha = null;
try {
key = myKey.getBytes("UTF-8");
sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
secretKey = new SecretKeySpec(key, "AES");
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String decrypt(String strToDecrypt, String secret) {
try{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, AES.secretKey);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
} catch (Exception e) {
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
}
Key: 1234567890123456 (Both Angular and Java side)
Clear data: this is my text
Chipered data in CryptoJS: U2FsdGVkX18C7J5wy5R5FRjfP5Xghpry3FtuTj5xq+o=
What Java backend receives: U2FsdGVkX18C7J5wy5R5FRjfP5Xghpry3FtuTj5xq+o=
调用java解密方法
@PostMapping("/decryption")
public ResponseEntity<DecryptResponseBean> decryption(@RequestBody DecryptRequestBean data){
String dataToDecrypt = data.getData();
String decrypted = AES.decrypt(dataToDecrypt, "my secret key");
DecryptResponseBean responseBean = new DecryptResponseBean(decrypted);
return ResponseEntity.ok(responseBean);
}
EDIT2:样本数据集
package com.mypackage;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class AES {
private static SecretKeySpec secretKey;
private static byte[] key;
public static void setKey(String myKey) {
MessageDigest sha = null;
try {
key = myKey.getBytes("UTF-8");
sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
secretKey = new SecretKeySpec(key, "AES");
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public static String decrypt(String strToDecrypt, String secret) {
try{
setKey(secret);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, AES.secretKey);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
} catch (Exception e) {
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
}
Key: 1234567890123456 (Both Angular and Java side)
Clear data: this is my text
Chipered data in CryptoJS: U2FsdGVkX18C7J5wy5R5FRjfP5Xghpry3FtuTj5xq+o=
What Java backend receives: U2FsdGVkX18C7J5wy5R5FRjfP5Xghpry3FtuTj5xq+o=
在Stackoverflow上搜索一下,您就可以找到与此相同的解决方案。重要的代码不是我自己写的,而是作者@Codo的答案,所以所有的功劳都归于他 Crypto.JS从密码短语(“密钥”)中导出密钥和初始化向量(iv),因此方法
GenerateKeyAndIV
负责获取密钥和iv
以下代码没有适当的异常处理,仅用于教育目的。
结果:
Java decryption from CryptoJS
decrypted text: this is my text
expected data: this is my text
代码:
您是否可以包含实际的堆栈跟踪,以便用户可以在提供的代码中看到异常发生的位置和时间!。。。提供一整套样本数据(明文、密钥和密文=加密文本)可能会有所帮助。请编辑您的帖子并添加数据,谢谢。添加了请求的详细信息,谢谢。这解决了问题,似乎我可以正确地从前端到后端加密/解密数据。谢谢!