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. web.py开发

    web.py需要使用python2.X,所以安装python版本2.7.9 web.py 是一个轻量级Python web框架,它简单而且功能强大 web.py安装 安装python (1)使用pip ...

  2. ABBYY FineReader 12没你想得那么简单

    你是否觉得自己对ABBYY FineReader 12已经了如指掌了?也许你会认为它不过就是一款OCR文字识别软件,能够快速方便地将扫描纸质文档.PDF文件或者数码相机的图像转换为可编辑.可搜索的格式 ...

  3. QT OpenGL绘制三维图形(立方体、圆柱体、圆锥、球体、圆环等等)

    本文使用QGLWidget来绘制各种三维基本图形,包括立方体.圆柱体.圆锥.球体.圆环等等,涉及包括基本绘制以及上色.纹理.旋转等操作. 使用的软件版本:QT5.12 + QT Creater4.8. ...

  4. Android内存泄漏检測与MAT使用

    公司相关项目须要进行内存优化.所以整理了一些分析内存泄漏的知识以及工作分析过程. 本文中不会刻意的编写一个内存泄漏的程序,然后利用工具去分析它.而是通过介绍相关概念,来分析怎样寻找内存泄漏.并附上自己 ...

  5. 使用powerdesigner连接MySQL并设置逆向工程图文教程

    我用的是Win7 x64的系统,安装了64为的mysql-connector-odbc-5.1.10-winx64.msi在数据源中test正常,但在powerdesigner连接Mysql总是弹出“ ...

  6. Create maintenance backup plan in SQL Server 2008 R2 using the wizard

    You will need to identify how you want your maintenance plan to be setup. In this example the mainte ...

  7. Unity透明Shader

    Shader "Custom/Blocks" { Properties { _Color (,,,) _MainTex ("Albedo (RGB)", 2D) ...

  8. commons-beanutils的使用

    commons-beanutils是通过内省来完成的. 需要两个包: commons-beanutils-1.8.3.jar commons-logging-1.1.1.jar JavaBean类: ...

  9. Kafka Java API操作topic

    Kafka官方提供了两个脚本来管理topic,包括topic的增删改查.其中kafka-topics.sh负责topic的创建与删除:kafka-configs.sh脚本负责topic的修改和查询,但 ...

  10. 使用node新建一个socket服务器连接Telnet客户端并且进行输入的显示

    最近在看node的socket,这个很有趣,这个可以很清晰的得到网络http请求的一个过程.首先我们需要一个Telnet的客户端,node(博主为8.0+版本) Telnet客户端的开启过程 有的系统 ...