AES算法是采用区块加密的一种算法,是美国政府用来取代DES的,相比较DES,AES效率更高、占用的存储器少,比DES更安全;现在3DES比也DES更安全,不管怎么说,都是为了安全,少一些致命的BUG和攻击。
1、AES加解密实现
package com.cn.dl.test;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class AESUtils {
//秘钥
private static final String KEY = "2ya@#ns$%shao^!_b=a+~1";
//秘钥长度:128、192、256
private static final int KEY_LENGTH = 128;
//加密算法
private static final String ALGORITHM = "AES";
//编码
private static final String CHARSET = "UTF-8";
/**
26 * 签名算法
27 */
public static final String SIGN_ALGORITHMS = "SHA1PRNG";
/**
* 加密字符串
* @param key 秘钥
* @param encodeStr 需要加密的字符串
* @return 密文
*/
public static String encodeAES(String key, String encodeStr) {
try {
KeyGenerator keyGenerator = getKeyGenerator(key);
byte[] enCodeFormat = keyGenerator.generateKey().getEncoded();
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(enCodeFormat, ALGORITHM));
return bytesToHexStr(cipher.doFinal(encodeStr.getBytes(CHARSET)));
} catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* AES解密
* @param key 秘钥
* @param decodeStr 需要解密的字符串
* @return 明文
*/
public static String decodeAES(String key,String decodeStr) {
try {
KeyGenerator keyGenerator = getKeyGenerator(key);
byte[] enCodeFormat = keyGenerator.generateKey().getEncoded();
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(enCodeFormat, ALGORITHM));
byte[] result = cipher.doFinal(hexStrToBytes(decodeStr));
return new String(result,CHARSET);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static KeyGenerator getKeyGenerator(String key) throws NoSuchAlgorithmException, UnsupportedEncodingException {
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
SecureRandom random = SecureRandom.getInstance(SIGN_ALGORITHMS);
random.setSeed(key.getBytes(CHARSET));
keyGenerator.init(KEY_LENGTH,random);
return keyGenerator;
}
/**
* byte数组转换成十六进制字符串
* @param bytes byte数组
* @return 返回十六进制字符串
*/
private static String bytesToHexStr(byte[] bytes) {
StringBuffer stringBuffer = new StringBuffer("");
for (int i = 0; i < bytes.length; ++i) {
stringBuffer.append(Integer.toHexString(0x0100 + (bytes[i] & 0x00FF)).substring(1).toUpperCase());
}
return stringBuffer.toString();
}
/**
* 十六进制字符串转成byte数组
* @param hexStr 十六进制字符串
* @return 返回byte数组
* */
private static byte[] hexStrToBytes(String hexStr) {
byte[] bytes = new byte[hexStr.length() / 2];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) Integer.parseInt(hexStr.substring(2 * i, 2 * i + 2), 16);
}
return bytes;
}
public static void main(String[] args) throws Exception{
String userId = "13240115";
String encode = AESUtils.encodeAES(KEY, userId);
String decode = AESUtils.decodeAES(KEY, encode);
System.out.println("用户id>>>" + userId);
System.out.println("用户id加密>>>" + encode);
System.out.println("用户id解密>>>" + decode);
}
}
执行结果:
用户id>>>13240115
用户id加密>>>C0F67FB4F7A9E83F7D262B0A06F9C566
用户id解密>>>13240115