Aes 是对称加密,所谓对称加密就是加密和解密均用同样的key即可,非对称加密解密参考《java.security.*篇(1) RSA加密解密》
涉及类Cipher SecretKeySpec IvParameterSpec
试用场景
由于是对称机密,因此适合一些加密破解不是很核心的场景,
适用场景主要如下:
非核心机密内容的通信,比如服务端-客户端聊天通信
非核心机密文件加密,查看时解密
非核心机密数据库数据内容加密,查看时解密等等
ase 加密解密 详细demo 如下
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency>
//加密key 必须是16bytes长度 private static final String AES_KEY = "aes-key-aes-key?"; //cbc模式向量iv 必须是16bytes长度 private static final String AES_IV = "abcdefg123456789";
/** * @description: demos of jdk8 java.security Cipher SecretKeySpec IvParameterSpec * Aes 算法加密解密 */ @Test public void testAesEncryptAndDecrypt() throws Exception { String data = "你好世界"; System.out.println("需要加密的字符串:"+data); String encryptData = encryptAes(data); System.out.println("aes 加密后的字符串为:"+encryptData); String decryptData = decryptAES(encryptData); System.out.println("aes 解密后的字符串为:"+decryptData); }
加密方法
/** * @description: aes 加密方法 * @param data 传入待加密数据 * @return 加密后的字符串 * */ public String encryptAes(String data) throws Exception { //创建密码器对象 并获取aes/cbc instance Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); //获取块大小 int blockSize = cipher.getBlockSize(); //获取要加密数据字节 byte[] dataBytes = data.getBytes(); //获取字节长度 int plaintextLength = dataBytes.length; //判断数据字节长度是否是块大小倍数,不是的话补齐 if (plaintextLength % blockSize != 0) { plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize)); } //初始化字节数组并将数据拷贝过去 byte[] plaintext = new byte[plaintextLength]; System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); //初始化aes eySpec SecretKeySpec keyspec = new SecretKeySpec(AES_KEY.getBytes(), "AES"); //初始化iv 向量,可增加加密算法的强度,cbc模式必须 IvParameterSpec ivspec = new IvParameterSpec(AES_IV.getBytes()); //初始化cipher 并赋值为encrypt对象 cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); //执行加密 byte[] encrypted = cipher.doFinal(plaintext); //base64 转码加密数据 return Base64.encodeUrlSafe(encrypted).trim(); }
解密方法
/** * @description: aes 解密方法 * @param data 传入加密后的数据 * @return 解密后的字符串 * */ public String decryptAES(String data) throws Exception { //base 解码数据 byte[] encrypted1 = Base64.decode(data); //初始化密码器并获取aes/cbc 模式对象 Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); //获取aes KeySpec SecretKeySpec keyspec = new SecretKeySpec(AES_KEY.getBytes(), "AES"); //初始化iv 向量,可增加加密算法的强度,cbc模式必须 IvParameterSpec ivspec = new IvParameterSpec(AES_IV.getBytes()); //初始化cipher 对象为decrpt 模式 cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); //执行解码 byte[] original = cipher.doFinal(encrypted1); //转为字符串并返回 String originalString = new String(original); return originalString.trim(); }
输出结果