博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AES 对称加密算法 加密\解密实例
阅读量:2232 次
发布时间:2019-05-09

本文共 4445 字,大约阅读时间需要 14 分钟。

package com.soufun.com;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.Date;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;/** * @author WHD data 2015年8月16日 */public class AesUtil {	private  static final String AES="AES";	private  static final String UTF8="UTF-8";	static KeyGenerator kgen =null;	static{		try {			kgen= KeyGenerator.getInstance(AES);		} catch (NoSuchAlgorithmException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}	/*	 * @param content:	 * @param password:	 */	private static byte[] encrypt(String content, String password) {		try {			// 使用静态代码块来生成KeyGenerator对象			//KeyGenerator kgen = KeyGenerator.getInstance(AES);			// 使用128 位			kgen.init(128, new SecureRandom(password.getBytes()));			SecretKey secretKey = kgen.generateKey();			byte[] encodeFormat = secretKey.getEncoded();			SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);			// Cipher对象实际完毕加密操作			Cipher cipher = Cipher.getInstance(AES);			// 加密内容进行编码			byte[] byteContent = content.getBytes(UTF8);			// 用密匙初始化Cipher对象			cipher.init(Cipher.ENCRYPT_MODE, key);			// 正式运行加密操作			byte[] result = cipher.doFinal(byteContent);			return result;		} catch (NoSuchAlgorithmException e) {			e.printStackTrace();		} catch (NoSuchPaddingException e) {			e.printStackTrace();		} catch (InvalidKeyException e) {			e.printStackTrace();		} catch (UnsupportedEncodingException e) {			e.printStackTrace();		} catch (IllegalBlockSizeException e) {			e.printStackTrace();		} catch (BadPaddingException e) {			e.printStackTrace();		}		return null;	}	/*	 * @param content:	 * @param password:	 */	private static byte[] decrypt(byte[] content, String password) {		try {// 使用静态代码块来生成KeyGenerator对象			//KeyGenerator kgen = KeyGenerator.getInstance(AES);			// 使用128 位			kgen.init(128, new SecureRandom(password.getBytes()));			SecretKey secretKey = kgen.generateKey();			byte[] encodeFormat = secretKey.getEncoded();			SecretKeySpec key = new SecretKeySpec(encodeFormat, AES);			// Cipher对象实际完毕加密操作			Cipher cipher = Cipher.getInstance(AES);			// 用密匙初始化Cipher对象			cipher.init(Cipher.DECRYPT_MODE, key);			// 正式运行解密操作			byte[] result = cipher.doFinal(content);			return result;		} 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();		}		return null;	}	/**	 * 二进制--》十六进制转化	 * @param buf	 * @return	 */	private static String parseByte2HexStr(byte buf[]) {		StringBuffer sb = new StringBuffer();		for (int i = 0; i < buf.length; i++) {			String hex = Integer.toHexString(buf[i] & 0xFF);			if (hex.length() == 1) {				hex = '0' + hex;			}			sb.append(hex.toUpperCase());		}		return sb.toString();	}	/**	 * 十六进制--》二进制转化	 * @param hexStr	 * @return	 */	private static byte[] parseHexStr2Byte(String hexStr) {		if (hexStr.length() < 1) {			return null;		}		byte[] result = new byte[hexStr.length() / 2];		for (int i = 0; i < hexStr.length() / 2; i++) {			int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);			int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),					16);			result[i] = (byte) (high * 16 + low);		}		return result;	}	public static void main(String[] args) throws UnsupportedEncodingException {		long begin=new Date().getTime();		String content = "aaades加密測试";		String password = "12345678dd";		// 加密		System.out.println("加密前:" + content);		byte[] encryptResult = encrypt(content, password);		String encryptResultStr = parseByte2HexStr(encryptResult);		System.out.println("加密后:" + encryptResultStr);		// 解密		byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);		byte[] decryptResult = decrypt(decryptFrom, password);		// 解密内容进行解码		String result = new String(decryptResult, UTF8);		System.out.println("解密后:" + result);		long end= new Date().getTime();		System.out.println(end-begin);	}}

注:SecureRandom是生成安全随机数序列,password.getBytes()是种子。仅仅要种子同样,序列就一样,所以解密仅仅要有password即可,能够复原这个序列。

转载于:https://www.cnblogs.com/ljbguanli/p/6889206.html

你可能感兴趣的文章
GridView+存储过程实现'真分页'
查看>>
flask_migrate
查看>>
解决activemq多消费者并发处理
查看>>
UDP连接和TCP连接的异同
查看>>
hibernate 时间段查询
查看>>
java操作cookie 实现两周内自动登录
查看>>
Tomcat 7优化前及优化后的性能对比
查看>>
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
C结构体、C++结构体、C++类的区别
查看>>