import java.nio.charset.Charset;

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import com.jfinal.log.Log;

/**
* AES安全编码组件
*
* 高级数据加密标准---AES:由于DES的问题所以产生了AES,像是DES的升级,密钥建立时间短,灵敏性好,内存要求低,被广泛应用
*
* 说明:
*
* 对于java.security.InvalidKeyException: Illegal key size or default
* parameters异常, 去掉这种限制需要下载Java Cryptography Extension (JCE) Unlimited Strength
* Jurisdiction Policy Files, 下载包的readme.txt
* 有安装说明。就是替换${java_home}/jre/lib/security/
* 下面的local_policy.jar和US_export_policy.jar
*/
public abstract class ToolAES {

@SuppressWarnings("unused")
private static final Log log = Log.getLog(ToolAES.class);

/**
* 密钥算法
*/
public static final String KEY_ALGORITHM = "AES";

/**
* 加密/解密算法 / 工作模式 / 填充方式 Java 6支持PKCS5Padding填充方式 Bouncy
* Castle支持PKCS7Padding填充方式
*/
public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

/**
* 转换密钥
*
* @param key
* 二进制密钥
* @return Key 密钥
* @throws Exception
*/
private static Key toKey(byte[] key) throws Exception {
// 实例化AES密钥材料
SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);

return secretKey;
}

/**
* 解密
*
* @param data
* 待解密数据
* @param key
* 密钥
* @return byte[] 解密数据
* @throws Exception
*/
public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
// 还原密钥
Key k = toKey(key);

/*
* 实例化 使用PKCS7Padding填充方式,按如下方式实现 Cipher.getInstance(CIPHER_ALGORITHM, "BC");
*/
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

// 初始化,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, k);

// 执行操作
return cipher.doFinal(data);
}

/**
* 加密
*
* @param data
* 待加密数据
* @param key
* 密钥
* @return byte[] 加密数据
* @throws Exception
*/
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
// 还原密钥
Key k = toKey(key);

/*
* 实例化 使用PKCS7Padding填充方式,按如下方式实现 Cipher.getInstance(CIPHER_ALGORITHM,
* "BC");
*/
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);

// 初始化,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, k);

// 执行操作
return cipher.doFinal(data);
}

/**
* 生成密钥 <br>
*
* @return byte[] 二进制密钥
* @throws Exception
*/
public static byte[] initKey() throws Exception {
// 实例化
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);

/*
* AES 要求密钥长度为 128位、192位或 256位
*/
// kg.init(256);
kg.init(128);

// 生成秘密密钥
SecretKey secretKey = kg.generateKey();

// 获得密钥的二进制编码形式
return secretKey.getEncoded();
}

public static void main(String[] args) {
try {
byte[] publicKey = initKey();
String dataStr = "今天的天气很好";
// byte[] beforData = dataStr.getBytes("UTF-8");
byte[] beforData = dataStr.getBytes();
log.info(new String(beforData));
byte[] afterData = encrypt(beforData, publicKey);
log.info(new String(afterData));

byte[] deData = decrypt(afterData, publicKey);
log.info(new String(deData));

} catch (Exception e) {
e.printStackTrace();
}
}
}

AES加密工具类(对称加密算法)的更多相关文章

  1. Java AES 加密工具类

    package com.microwisdom.utils; import java.security.NoSuchAlgorithmException; import java.security.S ...

  2. Android AES加密工具类实现(基础回顾)

    package com.powercreator.cms.util; import java.security.SecureRandom; import javax.crypto.Cipher; im ...

  3. AES 加密工具类

    /** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 对原始数据进行AES加密后,在进行Base64编码转化: */public class AESOperator { /* * 加密用的 ...

  4. java 加密工具类(MD5、RSA、AES等加密方式)

    1.加密工具类encryption MD5加密 import org.apache.commons.codec.digest.DigestUtils; /** * MD5加密组件 * * @autho ...

  5. AES算法工具类

    什么是对称加密算法? AES已经变成目前对称加密中最流行算法之一:AES可以使用128.192.和256位密钥,并且用128位分组加密和解密数据. 对称加密算法安全吗? 看过间谍局的知友们一定知道电台 ...

  6. App开发流程之加密工具类

    科技优家 2016-09-08 18:10 从这篇记录开始,记录的都算是干货了,都是一些编程日常的积累. 我建议先将基础的工具加入项目,后续的开发效率会呈指数增长.如果在专注功能开发过程中,才发现缺少 ...

  7. 带偏移量的AES加密工具

    自定义的一个对称加密工具类AESUtil.java public static final String ENCRYPTION_ALGORITHM = "AES"; public ...

  8. c# 加密工具类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Sec ...

  9. 加密工具类 - CryptoUtils.java

    加密工具类,包含MD5,BASE64,SHA,CRC32的加密与解密方法. 源码如下:(点击下载  - CryptoUtils.java.commons-io-2.4.jar.commons-code ...

随机推荐

  1. vue-cli生成的项目配置开发和生产环境不同的接口

    vue-cli生成的项目,vue项目配置了不同开发环境的接口地址,axios.defaults.baseURL如何引用这个地址,这是在我发布项目的时候考虑的,于是想到了 方法一: config下配置文 ...

  2. java中字符串太长,怎么自动换到下一行

    直接在中间代码出按回车

  3. Docker安装指南

    Ubuntu 14.04 16.04 (使用apt-get进行安装) # step 1: 安装必要的一些系统工具 sudo apt-get -y update sudo apt-get -y inst ...

  4. linux中通过awk进行文本的对齐格式化处理?awk printf左对齐?

    需求描述: 今天在对一个从excel文件中粘出来的内容进行整理的时候,发现格式很乱,就想用awk工具格式化一下,在此记录一下. 操作过程: 1.从excel中复制出来的内容 job_name    j ...

  5. 更改mysql的加密方式和密码策略

    -- 修改密码为用不过期 mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; Query O ...

  6. python monkey 猴子补丁技术编程,修改python json dumps方法。

    1.猴子补丁就是不改变原有模块的内容的前提下,给原有模块新增方法或者修改原有模块. 一个模块的函数,如果希望改变函数的功能,不改变函数名,通常是库模块,你不可能去修改三方库的源码的,实施起来不方便,而 ...

  7. struts2 第一次使用 404 页面引发的一系列问题

    环境:ubuntu  . eclipse.struts-2.3.24 问题描写叙述: 1.  struts2 訪问出现404 2.  严重: Exception starting filter Str ...

  8. Go面向对象(三)

    go语言中的大多数类型都是值予以,并且都可以包含对应的操作方法,在需要的时候你可以给任意类型增加新方法.二在实现某个接口时,无需从该接口集成,只需要实现该接口要求的所有方法即可.任何类型都可以被any ...

  9. jQuery Colorbox弹窗插件使用教程小结、属性设置详解以及colorbox关闭

    jQuery Colorbox是一款弹出层,内容播放插件,效果极佳,当然我主要是用来弹出图片啦. jQuery Colorbox不仅有弹性动画效果,淡入淡出效果,幻灯片播放,宽度自定义,还能够ajax ...

  10. Android中显示照片的Exif信息

    package com.hyzhou.pngexifdemo; import android.media.ExifInterface; import android.os.Bundle; import ...