填充加密的密钥长度不正确

时间:2016-05-06 15:27:13

标签: java security encryption

我在填充加密方面遇到了问题。我想我已将问题与此功能隔离开来了:

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我没有。

1 个答案:

答案 0 :(得分:1)

整个程序中byte []和String之间的转换似乎是个问题。尽可能保持字节[]然后它工作。

所以,经验教训:在byte []和String之间进行仔细的转换。