- ECB
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
public class AESDecrypt {
public static byte[] initSecretKey() throws NoSuchAlgorithmException {
//指定算法秘钥生成器
KeyGenerator kg = KeyGenerator.getInstance("aes");
//初始化秘钥生成器,使其具有确定到秘钥大小
kg.init(128);
//生成秘钥
SecretKey secretkey = kg.generateKey();
return secretkey.getEncoded();
}
public static byte[] encrypt(byte[] key, String src) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
//生成秘钥
SecretKeySpec keySpec = new SecretKeySpec(key, "aes");
/**
* 加密实际操作Cipher
*/
//创建Cipher对象
Cipher cipher = Cipher.getInstance("aes/ecb/PKCS5Padding");
//初始化Cipher
cipher.init(Cipher.ENCRYPT_MODE,keySpec);
byte[] data = src.getBytes();
//加密
byte[] encryptedData = cipher.doFinal(data);
return encryptedData;
}
public static void main(String[] args) throws NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, BadPaddingException, InvalidKeySpecException, InvalidKeyException, IOException {
//byte[] secretKey = initSecretKey();
//或者代码中约定key
String key = "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4";
byte[] secretKey = key.getBytes();
String str = "abc";
byte[] encryptedData = encrypt(secretKey, str);
String decrypteData = decrypt(secretKey, encryptedData);
}
public static String decrypt(byte[] key,byte[] encryptedData) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
//生成秘钥
SecretKeySpec keySpec = new SecretKeySpec(key, "aes");
/**
* 解密实际操作Cipher
*/
//创建Cipher对象
Cipher cipher = Cipher.getInstance("aes/ecb/PKCS5Padding");
//初始化Cipher
cipher.init(Cipher.DECRYPT_MODE,keySpec);
//加密
byte[] dencryptedData = cipher.doFinal(encryptedData);
return new String(dencryptedData);
}
}
- CBC
与ECB差别,同秘钥长度和填充方式加解密都要使用初始化向量,且初始化向量一致。也可参考下面CFB例子。
- CFB
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
public class AESDecrypt {
public static byte[] initSecretKey() throws NoSuchAlgorithmException {
//指定算法秘钥生成器
KeyGenerator kg = KeyGenerator.getInstance("aes");
//初始化秘钥生成器,使其具有确定到秘钥大小
kg.init(128);
//生成秘钥
SecretKey secretkey = kg.generateKey();
return secretkey.getEncoded();
}
public static byte[] encrypt(byte[] key, String src,byte[] keyIv) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException {
//生成秘钥
SecretKeySpec keySpec = new SecretKeySpec(key, "aes");
/**
* 加密实际操作Cipher
*/
//创建Cipher对象
Cipher cipher = Cipher.getInstance("aes/cfb/PKCS5Padding");
//创建初始化向量
IvParameterSpec iv = new IvParameterSpec(keyIv);
//初始化Cipher
cipher.init(Cipher.ENCRYPT_MODE,keySpec,iv);
byte[] data = src.getBytes();
//加密
byte[] encryptedData = cipher.doFinal(data);
return encryptedData;
}
public static void main(String[] args) throws NoSuchAlgorithmException, IllegalBlockSizeException, NoSuchPaddingException, BadPaddingException, InvalidKeySpecException, InvalidKeyException, IOException, InvalidAlgorithmParameterException {
//byte[] secretKey = initSecretKey();
//或者代码中约定key
String key = "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4";
byte[] secretKey = key.getBytes();
byte[] iv = {1,2,3,4,5,6,7,8,9,11,10,12,13,14,15,16};
String str = "abc";
byte[] encryptedData = encrypt(secretKey, str,iv);
String decrypteData = decrypt(secretKey, encryptedData,iv);
}
public static String decrypt(byte[] key,byte[] encryptedData,byte[] keyIv) throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
//生成秘钥
SecretKeySpec keySpec = new SecretKeySpec(key, "aes");
/**
* 解密实际操作Cipher
*/
//创建Cipher对象
Cipher cipher = Cipher.getInstance("aes/cfb/PKCS5Padding");
//创建初始化向量
IvParameterSpec iv = new IvParameterSpec(keyIv);
//初始化Cipher
cipher.init(Cipher.DECRYPT_MODE,keySpec,iv);
//加密
byte[] dencryptedData = cipher.doFinal(encryptedData);
return new String(dencryptedData);
}
}
PS:由128改成192,或256只要把密钥长度由16改成24,或32就好
AES各种模式和填充组合以及在线AES加解密工具:https://www.jianshu.com/p/e8969d8bb6d7