对称加密的特点: 即加密密钥 = 解密密钥
代码
import java.security.Key;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Scanner;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class AES {
//加密
private static Cipher cipher;
private static Key key;
public static void main(String[] args) {
// 创建一个键盘录入
Scanner sc = new Scanner(System.in);
System.out.println("请输入密钥: ");
while (!sc.hasNextLine()) {
sc.nextLine(); // 清空输入缓冲区
System.out.print("不能为空,请输入密钥:");
}
String keyString = sc.nextLine();
instance(keyString);
sc.nextLine(); // 清空输入缓冲区
System.out.println("\n请输入需要加密的数据:");
String a1 = sc.nextLine();
if (sc.hasNextLine() && !"".equals(a1.trim())) {
jdkAesEncoder(a1.trim());
}
sc.nextLine(); // 清空输入缓冲区
System.out.println("\n请输入加密后数据:");
String a2 = sc.nextLine();
if (sc.hasNextLine() && !"".equals(a2.trim())) {
jdkAesDecoder(a2.trim());
}
sc.close();
}
public static void instance(String keyString) {
try {
//生成key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
//设置密钥长度
keyGenerator.init(128, new SecureRandom(keyString.getBytes()));
//生成密钥对象
SecretKey secretKey = keyGenerator.generateKey();
//获取密钥
byte[] keyBytes = secretKey.getEncoded();
//key转换
key = new SecretKeySpec(keyBytes,"AES");
//加密
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 对称加密算法AES加密
**/
public static void jdkAesEncoder(String string){
try {
//初始化,设置为加密
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(string.getBytes());
String s = Base64.getEncoder().encodeToString(result);
System.out.println("加密结果: \n" + s + "\n");
} catch (Exception e) {
System.out.println("加密失败");
}
}
/**
* 对称加密算法AES解密
**/
public static void jdkAesDecoder(String string){
try {
//初始化,设置为解密
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] result = cipher.doFinal(Base64.getDecoder().decode(string));
String s1 = new String(result);
System.out.println("解密结果: \n" + s1 + "\n");
} catch (Exception e) {
System.out.println("解密失败");
}
}
}
CMD 调用
javac -encoding utf-8 *.java
java *