我在填充加密方面遇到了问题。我想我已将问题与此功能隔离开来了:
static String AESEncryptStringWithPassword(String s, String p) throws...{
//function to create key from string password
SecretKey secret = deriveAESKey(p);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal(s.getBytes(Charset.forName("UTF-8")));
String str = Base64.getEncoder().encodeToString(ciphertext);
return str;
}
当我去解密时,我会得到一个错误:当使用填充密码解密时,输入长度必须是16的倍数。
我已经检查过,这个方法是坏长度字符串的来源。没有其他方法可以破坏它。我不确定我到底做错了什么。我的代码基于这里的问题:Java 256-bit AES Password-Based Encryption
编辑:我稍微改变了编码,使用String(byte [],charset)代替。但是现在使用defaultcharset我有一个合适的字符串长度和utf-8我没有。
答案 0 :(得分:1)
整个程序中byte []和String之间的转换似乎是个问题。尽可能保持字节[]然后它工作。
所以,经验教训:在byte []和String之间进行仔细的转换。