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编码字符串,将其转换回字节数组并传递给函数。使用此方法,我将输入什么来解密?使用此方法,我将输入什么来解密?