import java.text.SimpleDateFormat;
import java.util.Date;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* 项目中要求访问某个页面的时候要有权限控制,由于是从一个系统跳到另一个系统 所以其中的一部分功能就是使用动态的URL链接 由于我自己负责,所以我的实现打算是这样的
* 使用AES加密采用CBC加密模式PKCS5PADDING填充方式,动态的URL的参数使用当前时间 IV向量采用当前时间的年月日,最近采用BASE64加密一下 这里只是提前写一下实现方案
*/
public class AesEncrypt {
static Cipher cipher;
static final String KEY_ALGORITHM = "AES";
static final String CIPHER_ALGORITHM_CBC = "AES/CBC/PKCS5Padding";
static SecretKey secretKey;
static String key;
public static void main(String[] args) throws Exception {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String date2String = sdf.format(date) + "00";
System.out.println(date2String);
String iv = date2String.substring(0, 8) + date2String.substring(0, 8);
key = iv;
String ans = encrypt(date2String, iv);
descrypt(ans, iv);
}
/**
* 使用AES 算法 加密,默认模式 AES/CBC/PKCS5Padding
*/
public static String encrypt(String str, String iv) throws Exception {
cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
// KeyGenerator 生成aes算法密钥
secretKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(iv.getBytes("utf-8")));// 使用加密模式初始化 密钥
byte[] encrypt = cipher.doFinal(str.getBytes("utf-8")); // 按单部分操作加密或解密数据,或者结束一个多部分操作。
String ans = new BASE64Encoder().encode(encrypt);
System.out.println(ans);
return ans;
}
/**
* 使用AES 算法 解密,默认模式 AES/CBC/PKCS5Padding
*/
static void descrypt(String str, String iv) throws Exception {
byte[] encrypt = new BASE64Decoder().decodeBuffer(str);
secretKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv.getBytes("utf-8")));// 使用解密模式初始化 密钥
byte[] decrypt = cipher.doFinal(encrypt);
System.out.println(new String(decrypt));
}
}