如何解密AES加密中的字符串?

时间:2016-10-27 01:38:23

标签: java encryption cryptography

所以我在使用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)

1 个答案:

答案 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,你会看到。