关键字:对称加密(AES)加密实现工具类(教程)
[url='http://www.wxdl.cn/java/rsa-aes.html']Java加密解密相关名词(概念)解释(RSA、AES)[/url]
[url='http://www.wxdl.cn/java/security-invalidkey-exception.html']错误:java.security.InvalidKeyException: Illegal key size or default parameters解决方法[/url]
目前发现AES加密虽然可以大量加密文本速度也很快,但是内存消耗很大,如果需要大量文本加密的同学需要好好评估一下。之后还会贴出非对称加密(RSA)的加密、解密示例,以及.net 与Java间RSA加密的转换。
AES解密、加密工具类例子
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
public class AESSecurityUtil {
/** 密钥算法 */
private static final String KEY_ALGORITHM = "AES";
private static final int KEY_SIZE = 128;
/** 加密/解密算法/工作模式/填充方法 */
// public static final String CIPHER_ALGORITHM = "AES/ECB/NoPadding";
/**
* 获取密钥
* @return
* @throws Exception
*/
public static Key getKey() throws Exception{
//实例化
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
//AES 要求密钥长度为128位、192位或256位
kg.init(KEY_SIZE);
//生成密钥
SecretKey secretKey = kg.generateKey();
return secretKey;
}
/**
* 转化密钥
* @param key 密钥
* @return Key 密钥
* @throws Exception
*/
public static Key codeToKey(String key) throws Exception{
byte[] keyBytes = Base64.decodeBase64(key);
SecretKey secretKey = new SecretKeySpec(keyBytes,KEY_ALGORITHM);
return secretKey;
}
/**
* 解密
* @param data 待解密数据
* @param key 密钥
* @return byte[] 解密数据
* @throws Exception
*/
private static String decrypt(byte[] data,byte[] key) throws Exception{
//还原密钥
Key k = new SecretKeySpec(key,KEY_ALGORITHM);
/**
* 实例化
* 使用PKCS7Padding填充方式,按如下方式实现
* Cipher.getInstance(CIPHER_ALGORITHM,"BC");
*/
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
//初始化,设置解密模式
cipher.init(Cipher.DECRYPT_MODE,k);
//执行操作
return new String(cipher.doFinal(data),"UTF-8");
}
/**
* 解密
* @param data 待解密数据
* @param key 密钥
* @return byte[] 解密数据
* @throws Exception
*/
public static String decrypt(String data,String key) throws Exception{
return decrypt(Base64.decodeBase64(data), Base64.decodeBase64(key));
}
/**
* 加密
* @param data 待加密数据
* @param key 密钥
* @return bytes[] 加密数据
* @throws Exception
*/
public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
//还原密钥
Key k = new SecretKeySpec(key,KEY_ALGORITHM);
/**
* 实例化
* 使用PKCS7Padding填充方式,按如下方式实现
* Cipher.getInstance(CIPHER_ALGORITHM,"BC");
*/
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
//初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE,k);
//执行操作
return cipher.doFinal(data);
}
public static String encrypt(String data,String key) throws Exception{
byte[] dataBytes = data.getBytes("UTF-8");
byte[] keyBytes = Base64.decodeBase64(key);
return Base64.encodeBase64String(encrypt(dataBytes, keyBytes));
}
/**
* 初始化密钥
* @return
* @throws Exception
*/
public static String getKeyStr() throws Exception{
return Base64.encodeBase64String(getKey().getEncoded());
}
public static void main(String[] args) throws Exception{
String key = "VxDksHQiTvQt9MMPtMVXdA==";
String wenjian = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<mainData>\n" +
"<config>\n" +
" <operate>1</operate> <!--0:删除,1:新增,2:修改-->\n" +
"</config>\n" +
"<dataList type=\"personnel\">\n" +
" <data id=\"员工主数据主键\"> <!--默认主数据代码-->\n" +
" <code></code> <!--代码-->\n" +
" <name></name> <!--姓名-->\n" +
" <sex></sex> <!--性别-->\n" +
" <birthday></birthday> <!--出生日期-->\n" +
" <education></education> <!--文化程度-->\n" +
" <idNumber></idNumber> <!--身份证号码-->\n" +
" <entryDate></entryDate> <!--入职日期-->\n" +
" <departureDate></departureDate> <!--离职日期-->\n" +
" <address></address> <!--住址-->\n" +
" <phoneNumber></phoneNumber> <!--电话-->\n" +
" <mobilePhoneNumber></mobilePhoneNumber><!--移动电话-->\n" +
" <email></email> <!--电子邮件-->\n" +
" <position></position> <!--职务-->\n" +
" <maritalStatus></maritalStatus> <!--婚姻状况-->\n" +
" <partyAffiliation></partyAffiliation><!--政治面貌-->\n" +
" <username></username> <!--用户名-->\n" +
" <sortNo></sortNo> <!--排序号-->\n" +
" <status></status> <!--状态-->\n" +
" <department></department> <!--所属部门-->\n" +
" <company></company> <!--所属公司-->\n" +
" </data>\n" +
"</dataList>\n" +
"</mainData>";
StringBuffer buffer = new StringBuffer();
for(int index = 0;index < 20000;index ++){
buffer.append(wenjian);
}
String jimm = buffer.toString();
String mw = AESSecurityUtil.encrypt(jimm,key);
System.out.println("密文:" + mw);
String jm = AESSecurityUtil.decrypt(mw,key);
System.out.println("明文:" + jm);
}
}