Java加解密-AES对称加密算法 - 铁马冰河2000
Java加解密-AES加密算法" title="对称加密算法">对称加密算法
AES
AES产生的原因是3重DES的效率比较低而DES的安全性较低。AES是目前使用最多的对称加密算法,AES还有一个优势是至今尚未被破解。AES通常用于移动通信系统的加密以及基于SSH协议的软件(SSH Client、SecurityCRT)的加密。密钥长度以及实现方如下:
无政策限制权限文件是指:因为某些国家的进口管制限制,java发布的运行环境包中的一些加解密有一定的限制(因为美国政府的一些原因)。一般的JDK的jre的security包中的local_policy.jar和US_export_policy.jar都是没有内容的,所以只能使用128位加密。下面是JDK和BC实现的AES加密(步骤和DES类似):
============================================================================AES加解密工具类:
import java.security.Key;import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.lang3.StringUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class SecurityAES {
public static String AES_MODE_JDK = "jdk";
public static String AES_MODE_BC = "bouncyCastle";
private Key key;
//单例模式
private static SecurityAES securityAES;
public static SecurityAES getInstance(String password, String succurityMode) {
if(securityAES == null) {
securityAES = new SecurityAES(password, succurityMode);
}
return securityAES;
}
private SecurityAES(String password, String succurityMode) {
try{
//1.生成key
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
KeyGenerator keyGenerator;
if(StringUtils.isNotBlank(succurityMode) && StringUtils.equals(AES_MODE_BC, succurityMode)) {
Security.addProvider(new BouncyCastleProvider());
keyGenerator = KeyGenerator.getInstance("aes", "BC");
}else {
keyGenerator = KeyGenerator.getInstance("aes");
}
keyGenerator.init(128, secureRandom);//初始化key的长度,只能是128,
SecretKey secretKey = keyGenerator.generateKey();//生成key
byte[] keyBytes = secretKey.getEncoded();//得到key的字节数组
//2.key的转换
key = new SecretKeySpec(keyBytes, "aes");
} catch (Exception e) {
e.printStackTrace();
}
}
public byte[] encrypt(byte[] array) {
try{
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//加解密方式+工作模式+填充方式
cipher.init(Cipher.ENCRYPT_MODE, key);//以加密模式初始化
return cipher.doFinal(array);
} catch(Exception e ){
e.printStackTrace();
}
return null;
}
public byte[] decrypt(byte[] array) {
try{
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//加解密方式+工作模式+填充方式
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(array);
} catch(Exception e ){
e.printStackTrace();
}
return null;
}
}
============================================================================AES加解密工具测试类:
@Testpublic void test_AES() throws Exception {
String src = "面向对象编程,object-oriented!@#*5"; // 需要加密的原始字符串
String password = "123456";
SecurityAES securityJdkAES = SecurityAES.getInstance(password, SecurityAES.AES_MODE_JDK);
byte[] encodeJdkAES = securityJdkAES.encrypt(src.getBytes());
System.out.println("JDK AES加密:" + Base64.encodeBase64String(encodeJdkAES));
byte[] decodeJdkAES = securityJdkAES.decrypt(encodeJdkAES);
System.out.println("JDK AES解密:" + new String(decodeJdkAES));
SecurityAES securityBcAES = SecurityAES.getInstance(password, SecurityAES.AES_MODE_BC);
byte[] encodeBcAES = securityBcAES.encrypt(src.getBytes());
System.out.println("bouncyCastle AES加密:" + Base64.encodeBase64String(encodeBcAES));
byte[] decodeBcAES = securityBcAES.decrypt(encodeBcAES);
System.out.println("bouncyCastle AES解密:" + new String(decodeBcAES));
}
以上是 Java加解密-AES对称加密算法 - 铁马冰河2000 的全部内容, 来源链接: utcz.com/z/394370.html