AES / CBC加密:添加填充但仍然出现IV错误

时间:2016-01-04 04:37:10

标签: android encryption cryptography aes

我对加密非常陌生,并且在验证服务器之前我已经负责加密密码(我知道这是不好的做法,但我必须遵循。) 。这是我的加密方法:

public static String encrypt(String src) {
    try {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        Key key = makeKey();
        AlgorithmParameterSpec iv = makeIv();

        cipher.init(Cipher.ENCRYPT_MODE, key, iv);
        return Base64.encodeBytes(cipher.doFinal(src.getBytes()));
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

 static AlgorithmParameterSpec makeIv() {
        return new IvParameterSpec(ENCRYPTION_IV.getBytes(encoding));
}


static Key makeKey() {
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] key = md.digest(ENCRYPTION_KEY.getBytes(encoding));
        return new SecretKeySpec(key, "AES");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return null;
}

iv由13个字符串组成。我指定了填充但为什么仍然出现InvalidAlgorithmParameterException: IV must be 16 bytes long.错误?我如何真正实现这种加密方法?

1 个答案:

答案 0 :(得分:1)

填充仅适用于正在加密的数据。数据几乎总是比你加密的加密块更长/更短,所以最后一个块需要一些填充。

但是你的IV必须是16个字节,用零填充你的IV将是一个安全漏洞。