获取异常java.security.InvalidKeyException:无效的AES密钥长度:28个字节

时间:2014-02-25 07:49:11

标签: java encryption aes

我使用以下unix命令为AES生成128位密钥并将其写入文件。

dd if=/dev/urandom of=/data/key.txt bs=16 count=1

我正在从java类中的文件中读取密钥并将其用于加密/解密

BufferedReader reader = new BufferedReader(new FileReader(keylocation.getFile()));
String line = null;
StringBuilder stringBuilder = new StringBuilder();
while ((line = reader.readLine()) != null) {
  stringBuilder.append(line);
}
String secretKey = stringBuilder.toString();
SecretKeySpec key = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES");

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
encryptedString = (Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))));

但我正在追踪异常

java.security.InvalidKeyException: Invalid AES key length: 28 bytes

由于我在文件中生成128位(16字节)密钥,它如何更改为28字节?

2 个答案:

答案 0 :(得分:3)

您使用ReaderReader的目的是阅读文本。

但是你想要二进制文件,即字节数组。

解决方案:请勿使用Reader。使用InputStream并读入16个元素的byte数组。

答案 1 :(得分:0)

urandom生成一个包含不可打印字符的字节块。使用缓冲读取器并读取为Java UTF-8可能会导致问题,因为编码转换可能会产生一些字节作为控制字符并产生更多数据。

使用InputStream应该解决获取字节而不是字符串的问题,或者您应该尝试使用其他命令创建可读键:

tr -dc A-Za-z0-9_ < /dev/urandom | head -c 16 > /data/key.txt