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. 《HTTP权威指南》学习笔记——URL和资源

    URL与资源 URL是互联网资源的标准化名称 1.浏览互联网资源 URL是浏览器寻找信息时所需的资源位置 URI是一类更通用的资源标识符,URL是它的子集. URI的两个子集:URL和URN URL提 ...

  2. jsch下载文件的两个注意点

    1.关于sftp文件上传和下载的网上很多code,此处就不多写了.主要记录下工作中遇到的两个问题需要多注意. 1.判断sftp远程文件是否存在,通过异常捕获来判断该文件是否存在,存在返回SftpATT ...

  3. QT基础:QMainWindow学习小结

    简述 普通的桌面应用程序有个共同的特性,有菜单栏.工具栏.状态栏.中央窗口等部件.菜单栏其实可以看成是一个窗口,菜单栏中的每一个菜单也可以看成一个窗口,每个部件基本都可以认为是一个窗口.那么这些典型的 ...

  4. Python打包-Pyinstaller

    我们知道,Python很优雅,很值得学习.但是Python是解释性语言,代码需要有Python解释器才能执行,相比较我们平时直接运行exe等可执行文件多了一步的麻烦. 于是,希望能将Python程序打 ...

  5. python中是否有单独的字符类型,通过下标的方式表示字符串中的字符

    说明: 在python中,没有单独的字符类型,一个字符呢就是一个大小为1的字符串. 并且可以通过下标的方式,表示字符串中的字符. 操作过程: 1.通过[ ]的方式表示字符串中的第几个字符 >&g ...

  6. js实现点击评论进行显示回复框

    有人在群里问如何在留言评论那里点击回复按钮,下面就自动显示一个回复框,他想要的效果如图: 于是我随意的写了一段HTML,代码如下: <!DOCTYPE HTML> <html lan ...

  7. android 读书笔记 1

    四层linux 内核层library java 虚拟机frameworkapplication 四组件活动(activity), 服务(service), 广播接收器(broadcast receiv ...

  8. Excel 导入遍历

    package com.founder.ec.cms.service.impl; import com.founder.ec.cms.service.ProductListImportService; ...

  9. Python Subprocess Popen 管道阻塞问题分析解决

    http://ju.outofmemory.cn/entry/279026 场景:1>不断播放mp3文件: 2>使用订阅发布模式保持tcp长连接,从服务器接收信息 造成程序hang死,但是 ...

  10. java 读写文件例子

    在linux下可以读写中文 import java.io.*; import java.text.SimpleDateFormat; import java.util.*; public class ...