zoukankan      html  css  js  c++  java
  • AES加密、解密工具类

    AES加密、解密工具类代码如下:

    package com.util;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    /**
     * 利用AES对string进行加密、解密;
     * 非常注意:encodeRules就是秘钥,是需要自己保密的钥匙,对同一个内容不许有同样的秘钥进行加密和解密才能够正确识别;
     * @author admin
     *
     */
    public class AESUtils {
    	/*
    	 * 加密 1.构造密钥生成器 2.根据ecnodeRules规则初始化密钥生成器 3.产生密钥 4.创建和初始化密码器 5.内容加密 6.返回字符串(非常注意:返回的字符串可能会因为过长而自动进行换行)
    	 */
    	public static String AESEncode(String encodeRules, String content) {
    		String result = "";
    		try {
    			// 1.构造密钥生成器,指定为AES算法,不区分大小写
    			KeyGenerator keygen = KeyGenerator.getInstance("AES");
    			// 2.根据ecnodeRules规则初始化密钥生成器
    			// 生成一个128位的随机源,根据传入的字节数组
    			keygen.init(128, new SecureRandom(encodeRules.getBytes()));
    			// 3.产生原始对称密钥
    			SecretKey original_key = keygen.generateKey();
    			// 4.获得原始对称密钥的字节数组
    			byte[] raw = original_key.getEncoded();
    			// 5.根据字节数组生成AES密钥
    			SecretKey key = new SecretKeySpec(raw, "AES");
    			// 6.根据指定算法AES自成密码器
    			Cipher cipher = Cipher.getInstance("AES");
    			// 7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
    			cipher.init(Cipher.ENCRYPT_MODE, key);
    			// 8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
    			byte[] byte_encode = content.getBytes("utf-8");
    			// 9.根据密码器的初始化方式--加密:将数据加密
    			byte[] byte_AES = cipher.doFinal(byte_encode);
    			// 10.将加密后的数据转换为字符串
    			// 这里用Base64Encoder中会找不到包
    			// 解决办法:
    			// 在项目的Build path中先移除JRE System Library,再添加库JRE System
    			// Library,重新编译后就一切正常了。
    			result= new String(new BASE64Encoder().encode(byte_AES));
    		} catch (NoSuchAlgorithmException e) {
    			e.printStackTrace();
    		} catch (NoSuchPaddingException e) {
    			e.printStackTrace();
    		} catch (InvalidKeyException e) {
    			e.printStackTrace();
    		} catch (IllegalBlockSizeException e) {
    			e.printStackTrace();
    		} catch (BadPaddingException e) {
    			e.printStackTrace();
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}finally{
    			return result;
    		}
    	}
    
    	/*
    	 * 非常注意:因为通过加密后的字符串可能会很长,并且字符串内可能有自动的换行,因此最好对字符串content进行replaceAll("
    |
    ","")处理,否则会报16进制类似的异常
    	 * 解密 解密过程: 1.同加密1-4步 2.将加密后的字符串反纺成byte[]数组 3.将加密内容解密
    	 */
    	public static String AESDncode(String encodeRules, String content) {
    		String result = "";
    		try {
    			// 1.构造密钥生成器,指定为AES算法,不区分大小写
    			KeyGenerator keygen = KeyGenerator.getInstance("AES");
    			// 2.根据ecnodeRules规则初始化密钥生成器
    			// 生成一个128位的随机源,根据传入的字节数组
    			keygen.init(128, new SecureRandom(encodeRules.getBytes()));
    			// 3.产生原始对称密钥
    			SecretKey original_key = keygen.generateKey();
    			// 4.获得原始对称密钥的字节数组
    			byte[] raw = original_key.getEncoded();
    			// 5.根据字节数组生成AES密钥
    			SecretKey key = new SecretKeySpec(raw, "AES");
    			// 6.根据指定算法AES自成密码器
    			Cipher cipher = Cipher.getInstance("AES");
    			// 7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
    			cipher.init(Cipher.DECRYPT_MODE, key);
    			// 8.将加密并编码后的内容解码成字节数组
    			byte[] byte_content = new BASE64Decoder().decodeBuffer(content);
    			/*
    			 * 解密
    			 */
    			byte[] byte_decode = cipher.doFinal(byte_content);
    			result = new String(byte_decode, "utf-8");
    		} catch (NoSuchAlgorithmException e) {
    			e.printStackTrace();
    		} catch (NoSuchPaddingException e) {
    			e.printStackTrace();
    		} catch (InvalidKeyException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (IllegalBlockSizeException e) {
    			e.printStackTrace();
    		} catch (BadPaddingException e) {
    			e.printStackTrace();
    		}finally{
    			return result;
    		}
    	}
    
    	public static void main(String[] args) {
    		String content = "123456";
    		String encodeStr = AESUtils.AESEncode(StringConstant.AESKey, content);
    		System.out.println("加密后:"+encodeStr);
    		String decodeStr = AESUtils.AESDncode(StringConstant.AESKey, encodeStr);
    		System.out.println("解密后:"+decodeStr);
    	}
    
    }
    

      以上代码,借鉴于他人,有些需要非常注意的地方自己做了注释,仅供自己以后参考使用。。。

  • 相关阅读:
    flock对文件锁定读写操作的问题 简单
    hdu 2899 Strange Fuction(二分)
    hdu 2199 Can you solve this equation? (二分)
    poj 3080 Blue Jeans (KMP)
    poj 2823 Sliding Window (单调队列)
    poj 2001 Shortest Prefixes (trie)
    poj 2503 Babelfish (trie)
    poj 1936 All in All
    hdu 3507 Print Article (DP, Monotone Queue)
    fzu 1894 志愿者选拔 (单调队列)
  • 原文地址:https://www.cnblogs.com/lsy-blogs/p/7767571.html
Copyright © 2011-2022 走看看