Java 使用返回空字符串的AES解密

Java 使用返回空字符串的AES解密,java,aes,Java,Aes,终端输出: 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; im

终端输出:

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);
        }
    }

}
这段代码在很大程度上与StackExchange上的其他代码不同,我只是想调整代码,使其不使用文件,而是使用控制台。由于某种原因,解密对我来说总是返回空的


如果你能帮我解决我的具体问题,我将不胜感激。非常感谢

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

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
而不是:

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

有关以Java打印数组的更多方法,请参阅。

如果要以Java打印数组,应先使用
Arrays.toString
将其转换为字符串:

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
而不是:

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

有关用Java打印数组的更多方法,请参阅。

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


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

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


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

使用此方法,我将输入什么来解密?使用此方法,我将输入什么来解密?