JAVA:AES解密

时间:2014-06-24 21:46:11

标签: java encryption aes

我目前遇到解密数据的问题。编码字符串的base64存储在数据库中。所以,我打印出编码的字符串然后尝试用“DECRYPT”而不是“ENCRYPT”重新运行它。但是,我从来没有得到Decrypter方法喜欢的值,它总是给我一个关于参数的错误或者不是16字节的值。

public class crypto {
    public static void main(String [] args) {
        String s = args[0];
        String s1 = args[1];
        String ivkey = "thisisasecretkey";
        byte[] ivraw = ivkey.getBytes();
        SecretKeySpec skeySpec = new SecretKeySpec(ivraw, "AES");

        if (s.equalsIgnoreCase("ENCRYPT")) {
            try {
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
                byte[] encrypted = cipher.doFinal(s1.getBytes());
                System.out.println(new String(Base64.encodeBase64(encrypted)));

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        } else {
            try {
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(Cipher.DECRYPT_MODE, skeySpec);
                byte[] encrypted = cipher.doFinal(s1.getBytes());
                System.out.println(new String(Base64.decodeBase64(encrypted)));

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return;
    };
}

命令:crypto "ENCRYPT" "password"
输出:5eQvSzPG1TE2AybgCmeV6A==

命令:crytpo "DECRYPT" "5eQvSzPG1TE2AybgCmeV6A=="
输出:java.security.InvalidKeyException: Parameters missing

我知道安全漏洞,这不是我要问的问题,我希望答案/评论不会被最佳做法搞得一团糟。

2 个答案:

答案 0 :(得分:2)

你应该做64 解码,你应该在解密前做

答案 1 :(得分:1)

您不包括初始化向量(IV)。 CBC模式下的AES具有16字节IV和16字节对称密钥。

String IV = "AAAAAAAAAAAAAAAA"; // generate this randomly
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(IV.getBytes()));
byte[] encrypted = cipher.doFinal(s.getBytes());

编辑:事实证明,加密不需要提供IV(如owlstead指出的那样),但解密确实如此。最好的选择是明确并在加密和解密中使用IV。更改您的解密功能以包含IV,您将遇到owlstead指出的代码中的另一个错误。