使用AES的Java字符串加密:只接受某些密钥
这个很奇怪,使用AES的Java字符串加密:只接受某些密钥,java,encryption,aes,Java,Encryption,Aes,这个很奇怪, import java.security.Key; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; public class CryptoUtils { private static final String AES = "AES"; // private
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class CryptoUtils {
private static final String AES = "AES";
// private static byte[] keyValue = new byte[] // OK
// { 'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y' };
private static byte[] keyValue = new byte[] // FAILS !!! WTF!
{ 'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'z' };
public static String encrypt(String Data) throws Exception {
Key key = new SecretKeySpec(keyValue, AES);
Cipher c = Cipher.getInstance(AES);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes());
return new BASE64Encoder().encode(encVal);
}
public static String decrypt(String encryptedData) throws Exception {
Key key = new SecretKeySpec(keyValue, AES);
Cipher c = Cipher.getInstance(AES);
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
return new String(decValue);
}
public static void main(String[] args) throws Exception {
System.out.println(CryptoUtils.encrypt("<PASSWORD>"));
System.out.println(CryptoUtils.decrypt("Z4i3ywGXil2QCfM6R8S5qw=="));
}
}
在解密方法内部
我不明白。为什么它在一种情况下有效而在另一种情况下无效
谢谢,
Bernhard它不会解决您的问题,但是您永远不应该指定没有模式和填充的密码算法。其原因是,默认情况下,它的安全性较低,并且规范中没有保证表示用于加密的转换(算法/模式/填充)在默认情况下与用于解密的转换相同。对于安全性,最好是明确的。因此:
Cipher c = Cipher.getInstance(AES);
应该是这样的:
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
无论你在哪里看到它
Artjom B.指出的问题是,您在main方法中对密码文本进行硬编码解密,这将是一个具有不同密钥的不同值。不确定问题是什么,它的行为与预期的一样。第一个是正确的钥匙,第二个不是。如果将加密结果直接传递给decrypt函数,而不硬编码可能是使用第一个密钥创建的密文,则第二个密钥将起作用。还有,这是怎么得到这么多选票的?Artjom B.是正确的。你的解密硬编码的密文在主方法,这将是一个不同的值与不同的密钥。我想,你是对的。不过,当你想解密某个东西时,它会说“BadPaddingException”而不是“无法用密钥y解密值x”,这是违反直觉的,甚至是误导性的。谢谢,最后一句话指出了这个问题。如果某个值无法解密,则会引发此误导性异常。
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");