我正在尝试使用AES加密和解密字符串,但是出现了一个错误,我不知道如何解决。这是代码:
当我运行它时,“decription”值为null。在(***)之前就失败了!
它给了我一个异常:
java.security.InvalidKeyException: 参数丢失 在com.sun.crypto.provider.CipherCore.init(CipherCore.java:388) 在com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:186) 在javax.crypto.Cipher.implInit(Cipher.java:787) 在javax.crypto.Cipher.chooseProvider(Cipher.java:849) 在javax.crypto.Cipher.init(Cipher.java:1213) 在javax.crypto.Cipher.init(Cipher.java:1153) 在firma.XmlEncryptionTest.decrypt(EncryptionTest.java:63) 在firma.XmlEncryptionTest.main(EncryptionTest.java:41)
其中第63行是(***)之前的那一行。我不知道我做错了什么,也不知道如何解决。我在网上搜索了一下,但没有找到缺少的参数是什么。
public class EncryptionTest{
public static void main(String[] args) {
String encrypt = new String(encrypt("1234567890123456"));
System.out.println("decrypted value:" + (decrypt("ThisIsASecretKey",encrypt)));
}
public static String encrypt(String value) {
try {
byte[] raw = new byte[]{'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'};
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(value.getBytes());
System.out.println("encrypted string:" + (new String(encrypted)));
return new String(skeySpec.getEncoded());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static String decrypt(String key, String encrypted) {
try {
SecretKeySpec skeySpec = new SecretKeySpec(Base64.decodeBase64(key), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(skeySpec.getEncoded(),"AES"));
(*)
byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
original.toString();
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}
当我运行它时,“decription”值为null。在(***)之前就失败了!
它给了我一个异常:
java.security.InvalidKeyException: 参数丢失 在com.sun.crypto.provider.CipherCore.init(CipherCore.java:388) 在com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:186) 在javax.crypto.Cipher.implInit(Cipher.java:787) 在javax.crypto.Cipher.chooseProvider(Cipher.java:849) 在javax.crypto.Cipher.init(Cipher.java:1213) 在javax.crypto.Cipher.init(Cipher.java:1153) 在firma.XmlEncryptionTest.decrypt(EncryptionTest.java:63) 在firma.XmlEncryptionTest.main(EncryptionTest.java:41)
其中第63行是(***)之前的那一行。我不知道我做错了什么,也不知道如何解决。我在网上搜索了一下,但没有找到缺少的参数是什么。
new SecretKeySpec(skeySpec.getEncoded(),"AES")
看起来很奇怪 - 为什么不直接使用skeySpec
? - Duncan Jones