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上的其他代码改编而来的 我只是想把这段代码改成不使用文件而是使用控制台 不过由于某些原因,我的解密总是返回空。
如果你能帮我找出我具体哪一行出错了,那将是非常感激的。非常感谢。
[B@504bae78
不是加密后的文本,而是一个字节数组的字符串表示。如果你想打印加密后的文本,你应该将字节数组转换为 基数64 以便使用可打印字符打印。
然后,当你的程序要求你输入生态文本时,输入base64编码的字符串,将其转换回字节数组并传递给函数。
当你想在Java中打印一个数组时,你应该使用 Arrays.toString
先将其转换为字符串。
System.out.println(Arrays.toString(byteCipherText));
而不是。
System.out.println(byteCipherText);
见 这个问题 了解更多在Java中打印数组的方法。