我目前遇到解密数据的问题。编码字符串的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
我知道安全漏洞,这不是我要问的问题,我希望答案/评论不会被最佳做法搞得一团糟。
答案 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指出的代码中的另一个错误。