我对加密非常陌生,并且在验证服务器之前我已经负责加密密码(我知道这是不好的做法,但我必须遵循。) 。这是我的加密方法:
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.
错误?我如何真正实现这种加密方法?
答案 0 :(得分:1)
填充仅适用于正在加密的数据。数据几乎总是比你加密的加密块更长/更短,所以最后一个块需要一些填充。
但是你的IV必须是16个字节,用零填充你的IV将是一个安全漏洞。