java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 java 基于 AES 对称加密算法实现的加密与解密功能, 结合完整实例形式分析了 AES 对称加密算法的定义与使用技巧, 需要的朋友可以参考下
本文实例讲述了 java 基于 AES 对称加密算法实现的加密与解密功能分享给大家供大家参考, 具体如下:
- 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
- */
- 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 就行, 可以复原这个序列
PS: 关于加密解密感兴趣的朋友还可以参考本站在线工具:
希望本文所述对大家 java 程序设计有所帮助
来源: http://www.phperz.com/article/18/0216/358949.html