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学习笔记——log无法输出的解决方法和命令行查看log日志

    本人邮箱:JohnTsai.Work@gmail.com,欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblogs.com/JohnTsai/p/3983936.html. 知识 ...

  2. 在Lua中计算含中文的字符串的长度

    --[[ @desc: 计算字符串字符个数 author:{author} time:-- :: --@inputstr: 源字符串 return 字符个数 ]] function getString ...

  3. phpstorm + x-debug 进行php调试

    参照http://www.cnblogs.com/tippoint/p/3429092.html 进行安装xdebug: 首先自己写一个打印php的页面,将phpinfo 拷贝到下面的框内进行分析. ...

  4. Ubuntu18.10安装网易云音乐(图文并茂!)

    听音乐,怎么少得了网易云音乐,下面我们在Ubuntu18.10上来安装下: 首先进入网易云音乐的下载页:https://music.163.com/#/download,选择下载Ubuntu版本: 我 ...

  5. sql 理解

    select b.*,  b.model_ent_name+cast(m.year as varchar)as modelname, m.index_value as val into #tb fro ...

  6. OpenSift源代码编译过程记录

    本文记录了在CentOS6.5上编译Sift的开源实现OpenSift的编译过程,同一时候记录了编译过程中的几个问题. sift的理论已经有非常多了,以下会给出链接: 1.Requirements a ...

  7. 8 -- 深入使用Spring -- 3...1 Resource实现类FileSystemResource

    8.3.1 Resource实现类------FileSystemResource:访问文件系统的资源的实现类 3.访问文件系统资源 Spring提供的FileSystemResource类用于访问文 ...

  8. openvpn记住用户名和密码,自动连接

    1, 打开openvpn安装目录 2, 在config目录中, 找到VPN服务器的配置文件, 我的是config.ovpn,将 auth-user-pass (若已经存在)改为 auth-user-p ...

  9. 【GIS】WGS84与Web墨卡托理解(转)

    坐标系 · WGS84,地理坐标系,单位度,在三维上可以很好的展示全球的数据,但在二维上显示时在高纬度地区变形较大,另由于WGS84坐标系与CGCS2000坐标系差异很小,所以WGS84坐标系在Web ...

  10. GreenPlum数据库安装

    第一章    文档概述 本文描述适用于Greenplum4.0以上版本的安装操作.所涉及到的操作系统相关参数调整,主要针对Redhat Linux操作系统. 第二章    安装介质 操作系统:Cent ...