import java.io.UnsupportedEncodingException;
import java.security.Key;
import java.security.Security; import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider; import com.jfinal.kit.PropKit;
import com.jfinal.log.Log; /**
* IDEA安全编码组件
*
* 国际数据加密标准---IDEA:完全是新突破,几乎同时和AES出现
*/
public abstract class ToolIDEA { private static final Log log = Log.getLog(ToolIDEA.class); /**
* 密钥算法
*/
public static final String KEY_ALGORITHM = "IDEA"; /**
* 加密/解密算法 / 工作模式 / 填充方式
*/
public static final String CIPHER_ALGORITHM = "IDEA/ECB/PKCS5Padding"; static {
// 加入BouncyCastleProvider支持
Security.addProvider(new BouncyCastleProvider());
} /**
* 转换密钥
*
* @param key
* 二进制密钥
* @return Key 密钥
* @throws Exception
*/
private static Key toKey(byte[] key) throws Exception {
// 生成秘密密钥
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); // 实例化
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); // 实例化
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); // 初始化
kg.init(128); // 生成秘密密钥
SecretKey secretKey = kg.generateKey(); // 获得密钥的二进制编码形式
return secretKey.getEncoded();
} /**
* 解密加密字符串
* @param securityKey 密钥
* @param content 待加密的字符串
* @return
* 说明:增加Base64编码
*/
public static String decrypt(String securityKey, String content) {
// 1. Base64解码cookie令牌
try {
content = ToolString.decode(content);
} catch (Exception e) {
if(log.isErrorEnabled()) log.error("Base64解码异常:content = " + content);
return null;
} // 2. 解密cookie令牌
byte[] securityByte = Base64.decodeBase64(content);
byte[] keyByte = Base64.decodeBase64(securityKey); byte[] dataByte = null;
try {
dataByte = decrypt(securityByte, keyByte);
} catch (Exception e) {
if(log.isErrorEnabled()) log.error("解密数据异常:content = " + content + ",securityKey = " + securityKey);
return null;
}
String data = new String(dataByte); return data;
} /**
* 解密加密字符串
* @param content 待加密的字符串
* @return
* 说明:增加Base64编码
*/
public static String decrypt(String content) {
String securityKey = PropKit.get(ConstantInit.config_securityKey_key);
return decrypt(securityKey, content);
} /**
* 生成加密字符串
* @param securityKey 密钥
* @param content 待加密的字符串
* @return
* 说明:增加Base64编码
*/
public static String encrypt(String securityKey, String content) {
byte[] authTokenByte = null;
try {
authTokenByte = content.getBytes(ToolString.encoding);
} catch (UnsupportedEncodingException e) {
if(log.isErrorEnabled()) log.error("字符串数据转byte异常:content = " + content);
return null;
}
byte[] keyByte = Base64.decodeBase64(securityKey); // 认证cookie加密
byte[] securityByte = null;
try {
securityByte = encrypt(authTokenByte, keyByte);
} catch (Exception e) {
if(log.isErrorEnabled()) log.error("加密数据异常:content = " + content + ",securityKey = " + securityKey);
return null;
}
String securityCookie = Base64.encodeBase64String(securityByte); // 认证cookie Base64编码
try {
securityCookie = ToolString.encode(securityCookie);
} catch (Exception e) {
if(log.isErrorEnabled()) log.error("数据Base64编码异常:content = " + content + ",securityKey = " + securityKey);
return null;
} return securityCookie;
} /**
* 生成加密字符串
* @param content 待加密的字符串
* @return
* 说明:增加Base64编码
*/
public static String encrypt(String content) {
String securityKey = PropKit.get(ConstantInit.config_securityKey_key);
return encrypt(securityKey, content);
} }

IDEA安全编码组件的更多相关文章

  1. JavaScript中URL的解码和编码

    这些URI方法encodeURI.encodeURIComponent().decodeURI().decodeURIComponent()代替了BOM的escape()和unescape()方法. ...

  2. ASP.Net中的编码与解码

    当javascript传递的参数中有中文时,服务端获得的将是乱码,此时需要用到编码和解码 javascript中编码与解码的三种方法 escape方法返回一个可在所有计算机上读取的编码 String ...

  3. JS编码解码详解

    今天在整理 js编码解码方法时,在网上搜资料,发现一篇文章讲的不错,讲解的非常简单明了,于是乎就想转载过来,却发现无法转载到博客园,最后只能卑鄙的摘抄过来.js编码解码就是将一些对URL和数据库敏感的 ...

  4. JS中encodeURI()、decodeURI()、encodeURIComponent()和decodeURIComponent()编码与解码

    编码解码问题. 解决这个问题大家一般都使用encodeURI或者encodeURIComponent方法,在这里做一下总结: 首先看看各个方法不同浏览器的支持程度 函数 描述 FF N IE deco ...

  5. js 编码详解

    今天在整理 js编码解码方法时,在网上搜资料,发现一篇文章讲的不错,讲解的非常简单明了,于是乎就想转载过来,却发现无法转载到博客园,最后只能卑鄙的摘抄过来.js编码解码就是将一些对URL和数据库敏感的 ...

  6. ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学

    ECC ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学,是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制.在软件注册保护方面起到很大的作用,一般的序列 ...

  7. 介绍DSA数字签名,非对称加密的另一种实现

    接下来我们介绍DSA数字签名,非对称加密的另一种实现. DSA DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS ...

  8. 分析DH加密算法,一种适基于密钥一致协议的加密算法。

    DH Diffie-Hellman算法(D-H算法),密钥一致协议.是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想.简单的说就是允许两名用户在公开媒体上交换信息以生成&quo ...

  9. 介绍对称加密算法,最常用的莫过于DES数据加密算法

    DES DES-Data Encryption Standard,即数据加密算法.是IBM公司于1975年研究成功并公开发表的.DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个 ...

随机推荐

  1. Android Material Design控件学习(二)——NavigationView的学习和使用

    前言 上次我们学习了TabLayout的用法,今天我们继续学习MaterialDesign(简称MD)控件--NavigationView. 正如其名,NavigationView,导航View.一般 ...

  2. rsync:重要的安全参数

    ---------------------------------------------------------------------------------------------------- ...

  3. Spring3+mybatis3在多数据源情况下找不到数据库驱动的问题

    解决问题的过程如下: 1.遇到问题和一般的解决方法和下面这个帖子的一样: http://www.oschina.net/question/188964_32305 2.我在按照1的做法配置了以后,依然 ...

  4. QT编译错误:Project ERROR: This example requires Qt to be configured with -opengl desktop

    学习QT场景视图,对一个Boxes的例子比较感兴趣,于是去编译学习,结果编译不能通过(使用的是QT5.12): Project ERROR: This example requires Qt to b ...

  5. js九九乘法表的应用

    <html> <head> <meta charset=utf-8" /> <title>js九九乘法表</title> < ...

  6. 安装MySQL-python: EnvironmentError:mysql config not found

    1执行 sudo yum install python-devel 2 find / -name mysql_config 在/usr/bin/下发现了这个文件 3. 后修改MySQL-python- ...

  7. zabbix服务端安装指南及常见问题解决

    1. 首先要准备LNMP环境 2. 在mysql中创建zabbix所需要的库和用户 mysql -uroot -pmysql> CREATE DATABASE zabbix CHARACTER ...

  8. mysql数据库中查看当前使用的数据库是哪个数据库?

    环境描述: mysql版本:5.5.57-log 操作系统版本:Red Hat Enterprise Linux Server release 6.6 (Santiago) 需求说明: 查看当前使用的 ...

  9. jqgrid api

    http://www.cnblogs.com/onflying/archive/2013/05/14/3077505.html

  10. WCF服务支持HTTP(get,post)方式请求例子

    https://www.cnblogs.com/li150dan/p/9529413.html /// <summary> /// Http Get请求 /// </summary& ...