• 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);
    	}
    
    }
    

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

  • 相关阅读:
    深度通道编程模型
    缓冲区溢出实验实验楼
    团队作业(一)
    信安导论学习阶段性总结
    Python总结
    mysql下载及安装
    初识python
    MobileMenuScene来点动画效果
    移动菜单页面PlayerInput
    渲染和填充MobileMenuListItem
  • 原文地址:https://www.cnblogs.com/lsy-blogs/p/7767571.html
Copyright © 2020-2023  润新知