使用 AES 解密返回空白字符串

Decrypting using AES returning blank string

import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.*;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.util.Arrays;

import java.util.*;

public class AES {

    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(System.in);

        System.out.println("Enter your 16 character key here:");
        String EncryptionKey = input.next();
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IvParameterSpec ivspec = new IvParameterSpec(iv);

        KeyGenerator KeyGen = KeyGenerator.getInstance("AES");
        KeyGen.init(128);

        Cipher AesCipher = Cipher.getInstance("AES/CFB/NoPadding");
        System.out.println("Enter text to encrypt or decrypt:");
        String Text = input.next();

        System.out.println("Do you want to encrypt or decrypt (e/d)");
        String answer = input.next();
        if (answer.equalsIgnoreCase("e")) {

            byte[] byteKey = (EncryptionKey.getBytes());
            byte[] byteText = (Text).getBytes();
            SecretKeySpec secretKeySpec = new SecretKeySpec(byteKey, "AES");
            AesCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivspec);
            AesCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivspec); // ERROR LINE
            byte[] byteCipherText = AesCipher.doFinal(byteText);

            System.out.println(byteCipherText);

        } else if (answer.equalsIgnoreCase("d")) {

            byte[] byteKey = (EncryptionKey.getBytes());
            byte[] byteText = (Text).getBytes();
            String decryptKeyString = input.nextLine();
            Charset charset = StandardCharsets.UTF_16;
            byte[] cipherText = decryptKeyString.getBytes(charset);

            SecretKeySpec secretKeySpec = new SecretKeySpec(byteKey, "AES");
            AesCipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivspec); // ERROR LINE
            //byte[] bytePlainText = AesCipher.doFinal(cipherText);
            String plaintext = new String(AesCipher.doFinal(cipherText), "UTF-8");
            //Files.write(Paths.get(FileName2), bytePlainText);
            System.out.println(plaintext);
        }
    }

}

终端输出:

Enter your 16 character key here:
electricboogaloo
Enter text to encrypt or decrypt:
helloworld
Do you want to encrypt or decrypt (e/d)
e
[B@504bae78
//SECOND RUN OF PROGRAM
Enter your 16 character key here:
electricboogaloo
Enter text to encrypt or decrypt:
[B@504bae78
Do you want to encrypt or decrypt (e/d)
d

此代码主要是从 StackExchange 上的其他代码改用而来,我只是想调整代码以不使用文件,而是使用控制台。出于某种原因,解密对我来说总是 returns 是空的。

如果您能帮我解决我错在哪一行,将不胜感激。非常感谢。

当你想打印Java中的数组时,你应该先使用Arrays.toString将其转换为字符串:

System.out.println(Arrays.toString(byteCipherText));

而不是:

System.out.println(byteCipherText);

有关在 Java 中打印数组的更多方法,请参见 this question

[B@504bae78不是密文,而是字节数组的字符串表示。如果要打印编码后的文本,应将字节数组转换为 base64,以便使用可打印字符进行打印。

然后,当您的程序要求您输入加密文本时,输入 base64 编码的字符串,将其转换回字节数组并将其传递给函数。