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

问题描述 投票:0回答:1
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);
        }
    }

}

TERMINAL OUTPUT。

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上的其他代码改编而来的 我只是想把这段代码改成不使用文件而是使用控制台 不过由于某些原因,我的解密总是返回空。

如果你能帮我找出我具体哪一行出错了,那将是非常感激的。非常感谢。

java aes
1个回答
1
投票

[B@504bae78 不是加密后的文本,而是一个字节数组的字符串表示。如果你想打印加密后的文本,你应该将字节数组转换为 基数64 以便使用可打印字符打印。

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


1
投票

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

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

而不是。

System.out.println(byteCipherText);

这个问题 了解更多在Java中打印数组的方法。

© www.soinside.com 2019 - 2024. All rights reserved.