zoukankan      html  css  js  c++  java
  • AES对称加密util

    package cn.com.qmhd.oto.common;
    
    import java.security.Key;
    import java.security.NoSuchAlgorithmException;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    import com.alibaba.druid.util.HexBin;
    
    //import org.springframework.security.crypto.codec.Hex;
    
    /**
     * AES Coder<br/>
     * secret key length: 128bit, default: 128 bit<br/>
     * mode: ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128<br/>
     * padding: Nopadding/PKCS5Padding/ISO10126Padding/
     * 
     * 
     */
    public class AESUtil {
    
    	/**
    	 * 密钥算法
    	 */
    	private static final String KEY_ALGORITHM = "AES";
    
    	private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
    
    	/**
    	 * 初始化密钥
    	 * 
    	 * @return byte[] 密钥
    	 * @throws Exception
    	 */
    	public static byte[] initSecretKey() {
    		// 返回生成指定算法的秘密密钥的 KeyGenerator 对象
    		KeyGenerator kg = null;
    		try {
    			kg = KeyGenerator.getInstance(KEY_ALGORITHM);
    		} catch (NoSuchAlgorithmException e) {
    			e.printStackTrace();
    			return new byte[0];
    		}
    		// 初始化此密钥生成器,使其具有确定的密钥大小
    		// AES 要求密钥长度为 128
    		kg.init(128);
    		// 生成一个密钥
    		SecretKey secretKey = kg.generateKey();
    		return secretKey.getEncoded();
    	}
    
    	/**
    	 * 转换密钥
    	 * 
    	 * @param key
    	 *            二进制密钥
    	 * @return 密钥
    	 */
    	private static Key toKey(byte[] key) {
    		// 生成密钥
    		return new SecretKeySpec(key, KEY_ALGORITHM);
    	}
    
    	/**
    	 * 加密
    	 * 
    	 * @param data
    	 *            待加密数据
    	 * @param key
    	 *            密钥
    	 * @return byte[] 加密数据
    	 * @throws Exception
    	 */
    	public static byte[] encrypt(byte[] data, Key key) throws Exception {
    		return encrypt(data, key, DEFAULT_CIPHER_ALGORITHM);
    	}
    
    	/**
    	 * 加密
    	 * 
    	 * @param data
    	 *            待加密数据
    	 * @param key
    	 *            二进制密钥
    	 * @return byte[] 加密数据
    	 * @throws Exception
    	 */
    	public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    		return encrypt(data, key, DEFAULT_CIPHER_ALGORITHM);
    	}
    
    	/**
    	 * 加密
    	 * 
    	 * @param data
    	 *            待加密数据
    	 * @param key
    	 *            二进制密钥
    	 * @param cipherAlgorithm
    	 *            加密算法/工作模式/填充方式
    	 * @return byte[] 加密数据
    	 * @throws Exception
    	 */
    	public static byte[] encrypt(byte[] data, byte[] key, String cipherAlgorithm) throws Exception {
    		// 还原密钥
    		Key k = toKey(key);
    		return encrypt(data, k, cipherAlgorithm);
    	}
    
    	/**
    	 * 加密
    	 * 
    	 * @param data
    	 *            待加密数据
    	 * @param key
    	 *            密钥
    	 * @param cipherAlgorithm
    	 *            加密算法/工作模式/填充方式
    	 * @return byte[] 加密数据
    	 * @throws Exception
    	 */
    	public static byte[] encrypt(byte[] data, Key key, String cipherAlgorithm) throws Exception {
    		// 实例化
    		Cipher cipher = Cipher.getInstance(cipherAlgorithm);
    		// 使用密钥初始化,设置为加密模式
    		cipher.init(Cipher.ENCRYPT_MODE, key);
    		// 执行操作
    		return cipher.doFinal(data);
    	}
    
    	/**
    	 * 解密
    	 * 
    	 * @param data
    	 *            待解密数据
    	 * @param key
    	 *            二进制密钥
    	 * @return byte[] 解密数据
    	 * @throws Exception
    	 */
    	public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
    		return decrypt(data, key, DEFAULT_CIPHER_ALGORITHM);
    	}
    
    	/**
    	 * 解密
    	 * 
    	 * @param data
    	 *            待解密数据
    	 * @param key
    	 *            密钥
    	 * @return byte[] 解密数据
    	 * @throws Exception
    	 */
    	public static byte[] decrypt(byte[] data, Key key) throws Exception {
    		return decrypt(data, key, DEFAULT_CIPHER_ALGORITHM);
    	}
    
    	/**
    	 * 解密
    	 * 
    	 * @param data
    	 *            待解密数据
    	 * @param key
    	 *            二进制密钥
    	 * @param cipherAlgorithm
    	 *            加密算法/工作模式/填充方式
    	 * @return byte[] 解密数据
    	 * @throws Exception
    	 */
    	public static byte[] decrypt(byte[] data, byte[] key, String cipherAlgorithm) throws Exception {
    		// 还原密钥
    		Key k = toKey(key);
    		return decrypt(data, k, cipherAlgorithm);
    	}
    
    	/**
    	 * 解密
    	 * 
    	 * @param data
    	 *            待解密数据
    	 * @param key
    	 *            密钥
    	 * @param cipherAlgorithm
    	 *            加密算法/工作模式/填充方式
    	 * @return byte[] 解密数据
    	 * @throws Exception
    	 */
    	public static byte[] decrypt(byte[] data, Key key, String cipherAlgorithm) throws Exception {
    		// 实例化
    		Cipher cipher = Cipher.getInstance(cipherAlgorithm);
    		// 使用密钥初始化,设置为解密模式
    		cipher.init(Cipher.DECRYPT_MODE, key);
    		// 执行操作
    		return cipher.doFinal(data);
    	}
    
    	private static String showByteArray(byte[] data) {
    		if (null == data) {
    			return null;
    		}
    		StringBuilder sb = new StringBuilder("{");
    		for (byte b : data) {
    			sb.append(b).append(",");
    		}
    		sb.deleteCharAt(sb.length() - 1);
    		sb.append("}");
    		return sb.toString();
    	}
    	
    	public static byte[] stringToBytes(String s){
    		return HexBin.decode(s);
    	}
    	
    	public static String bytesToString(byte[] key){
    		return HexBin.encode(key);
    	}
    
    	public static void main(String[] args) throws Exception {
    //		byte[] key = initSecretKey();
    		byte[] key = stringToBytes("7939a2d9c827f53718cc6543acc1e197");
    		System.out.println("key:" + showByteArray(key));
    		System.out.println("生成的key字符串:" + bytesToString(key));
    
    //		Key k = toKey(key);
    
    		String data = "52607";
    		System.out.println("加密前数据: string:" + data);
    		System.out.println("加密前数据: byte[]:" + showByteArray(data.getBytes()));
    		System.out.println();
    		byte[] encryptData = encrypt(data.getBytes(), key);
    		System.out.println("加密后数据: byte[]:" + showByteArray(encryptData));
    		// System.out.println("加密后数据: hexStr:"+Hex.encodeHexStr(encryptData));
    		System.out.println("加密后数据: hexStr:" + bytesToString(encryptData));
    		System.out.println();
    		byte[] decryptData = decrypt(encryptData, key);
    		System.out.println("解密后数据: byte[]:" + showByteArray(decryptData));
    		System.out.println("解密后数据: string:" + new String(decryptData));
    		
    	}
    }
    

      

  • 相关阅读:
    有36辆自动赛车和6条跑道,没有计时器的前提下,最少用几次比赛可以筛选出最快的三辆赛车?----腾讯2016研发工程师在线模拟笔试题
    10G个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可
    计算机网络总结(二)
    计算机网络总结(一)
    最小编辑距离
    寻找两个有序数组的中位数
    Linux下几款C++程序中的内存泄露检查工具
    DDIA
    推荐引擎
    Innodb中的事务隔离级别和锁的关系
  • 原文地址:https://www.cnblogs.com/xdcr/p/6226784.html
Copyright © 2011-2022 走看看