我使用以下代码加密数据。我的输入是16个字节,密钥是16个字节,但我得到的输出(加密数据)是32个字节。为什么呢?
public static byte[] encrypt(byte[] plainText, byte[] key) {
try {
byte[] passwordKey128 = Arrays.copyOfRange(key, 0, 16);
SecretKeySpec secretKey = new SecretKeySpec(passwordKey128, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] cipherText = cipher.doFinal(plainText);
// String encryptedString = Base64.getEncoder().encodeToString(cipherText);
return cipherText;
可能是什么原因? AES会添加一些数据吗?
答案 0 :(得分:2)
您通过Cipher
方法获取Cipher.getInstance(transformation)
对象,其中转换的格式为:
"algorithm/mode/padding" or
"algorithm"
执行此操作时,实现将搜索系统中的加密提供程序列表,并确定是否有任何实现支持此操作。如果未指定模式和填充,则由密码提供程序决定使用哪种默认模式和填充。
根据this,例如,SunJCE默认为ECB作为默认模式, PKCS5Padding 。
由于 PKCS5Padding 总是至少添加一个字节,因此它将超过块的限制推送您的16个字节,并且需要两个块。