Java加解密-AES对称加密算法 - 铁马冰河2000

java

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加解密工具测试类:

    @Test

public 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

回到顶部