我使用以下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字节?
答案 0 :(得分:3)
您使用Reader
。 Reader
的目的是阅读文本。
但是你想要二进制文件,即字节数组。
解决方案:请勿使用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