AES加密实例
接上篇,这次写个AES加密的实例,作为DES加密的替代者,它更加安全,使用也较为广泛。
?
AES加密工具类:
package com.royboy.encrypt;import java.security.Key;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AESEncrypt {/** *密钥算法 */private static final String KEY_ALGORITHM = "AES";/** * 加密、解密算法/工作模式/填充方式 */private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";/** * 得到密钥 * @return */public static byte[] initKey() throws Exception{//实例化密钥生成器KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);/* * 初始化 * 如需要256位的密钥需要无政策限制权限文件或者用Bouncy Castle提供的算法 * */kg.init(128);//生成密钥SecretKey secretKey = kg.generateKey();//获得二进制编码的密钥return secretKey.getEncoded();}/** * 封装密钥 * @param key 二进制密钥 * @return */private static Key decorateKey(byte[] key){//实例化密钥材料SecretKey secretKey = new SecretKeySpec(key,KEY_ALGORITHM);return secretKey;}/** * 加密数据 * @param data 加密前的数据 * @param key 密钥 * @return 加密后的数据 */public static byte[] encryptData(byte[] data,byte[] key) throws Exception{Key k = decorateKey(key);//实例化Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);//实始化,设置为加密模式cipher.init(Cipher.ENCRYPT_MODE, k);return cipher.doFinal(data);}/** * 解密数据 * @param data 加密的数据 * @param key 密钥 * @return 解密后的数据 */public static byte[] decryptData(byte[] data,byte[] key) throws Exception{Key k = decorateKey(key);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);//实始化,设置为解密模式cipher.init(Cipher.DECRYPT_MODE, k);return cipher.doFinal(data);}}??
AES加密测试类:
?
package com.royboy.encrypt;import org.junit.Test;import static org.junit.Assert.*;import com.sun.org.apache.xml.internal.security.utils.Base64;public class AESTester {/** * AES数据加/解密测试 * @throws Exception */@Testpublic final void test() throws Exception{String primevalData = "《孙子兵法》 《春秋战国》";byte[] data = primevalData.getBytes();System.out.println("原始内容:"+primevalData);//得到密钥byte[] key = AESEncrypt.initKey();System.out.println("加密密钥:"+Base64.encode(key));byte[] encrypt = AESEncrypt.encryptData(data, key);System.out.println("加密数据:"+Base64.encode(encrypt));byte[] decrypt = AESEncrypt.decryptData(encrypt, key);String decryptStr = new String(decrypt);System.out.println("解密数据:"+decryptStr);assertEquals(primevalData,decryptStr);}}??