所以我在使用java AES加密解密文件或字符串时遇到问题。所以我有一个包含二进制数的 text 变量。我创建了一个随机密钥。然后我加密了文本并返回加密的 byte [] ,并将其写入 .txt 文件。加密过程有效。
然后我抓住 exampleOrig.txt 中的所有字节并执行解密过程并在下面返回错误。我不确定是什么错,做了一些研究,但它并没有真正帮助。任何帮助,将不胜感激。谢谢!
public static void main(String[] args) throws Exception {
// Generate AES Key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecretKey myAesKey = keyGenerator.generateKey();
Cipher aesCipher = Cipher.getInstance("AES");
String text = "11111110001100110011011111111011011111111101000111000101111111111111111001011110110001011111110111111001110110011100110111011111101111100111101";
// ENCRYPT the text
aesCipher.init(Cipher.ENCRYPT_MODE, myAesKey);
byte[] textEncrypted = aesCipher.doFinal(text.getBytes());
// Output results
System.out.println("Text [Byte Format]: " + text);
System.out.println("Text : " + new String(text));
System.out.println("Text Encrypted: " + textEncrypted);
// Write the 'text' to a file
File encryptFileResult = new File("TestFiles/exampleOrig.txt");
if (!encryptFileResult.exists()) {
encryptFileResult.createNewFile();
} else {
encryptFileResult.delete();
encryptFileResult.createNewFile();
}
FileWriter encryptFileWriter = new FileWriter(encryptFileResult.getAbsoluteFile());
BufferedWriter bufferedWriter = new BufferedWriter(encryptFileWriter);
bufferedWriter.write(new String(textEncrypted));
bufferedWriter.close();
// Grab all bytes from the 'exampleOrig.txt' file
byte[] encryptedBytes = Files.readAllBytes(encryptFileResult.toPath());
// DECRYPT the text
aesCipher.init(Cipher.DECRYPT_MODE, myAesKey);
byte[] textDecrypted = aesCipher.doFinal(encryptedBytes);
System.out.println("Text Decrypted: " + new String(textDecrypted));
}
错误消息:
Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:913)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at main.AESEncryption.main(AESEncryption.java:50)
答案 0 :(得分:1)
System.out.println("Text : " + new String(text));
System.out.println("Text Encrypted: " + textEncrypted);
上面的代码对加密数据毫无意义,因为加密数据是二进制的。您应该循环遍历字节数组并通过将每个字节转换为HEX来打印每个字节:
for (byte b : textEncrypted) {
if ((b & 0xFF) < 0x10) {
System.out.print("0");
}
System.out.print(Integer.toHexString(b & 0xFF).toUpperCase() + " ");
}
System.out.println();
您的错误是因为FileWriter。 FileWriter用于编写字符数据,您应该使用FileOutputStream。
比较字节数组textEncrypted和encryptedBytes,你会看到。