Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用AES的Java字符串加密:只接受某些密钥_Java_Encryption_Aes - Fatal编程技术网

使用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");