AES/DES 可逆性加密算法 -- java工具类
package com.lock.demo.service; import org.apache.tomcat.util.codec.binary.Base64; import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec; /**
* @author niunafei
* @function
* des 对称性算法加密 解密工具类 可逆性算法
* @email niunafei0315@163.com
* @date 2018/12/12 下午2:05
*/
public class DesUtils { private static final String DES="DES"; /**
* 公钥 8位以上
*/
private static final String SECRET_KEY="12345678"; /**
* 获取秘钥对象
* @return
* @throws Exception
*/
private static final SecretKey getSecretKeyFactory() throws Exception {
SecretKeyFactory des = SecretKeyFactory.getInstance(DES);
SecretKey secretKey = des.generateSecret(new DESKeySpec(SECRET_KEY.getBytes()));
return secretKey;
} /**
* 加密
* @param param
* @return
* @throws Exception
*/
public static final String encryption(String param) throws Exception {
Cipher cipher = Cipher.getInstance(DES);
SecretKey secretKey = getSecretKeyFactory();
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return new String(Base64.encodeBase64(cipher.doFinal(param.toString().getBytes())));
} /**
* 解密
* @param value
* @return
* @throws Exception
*/
public static final String decrypt(String value) throws Exception {
Cipher cipher = Cipher.getInstance(DES);
SecretKey secretKey = getSecretKeyFactory();
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return new String(cipher.doFinal(Base64.decodeBase64(value.getBytes())));
} /**
测试
*/
public static void main(String[] args) throws Exception {
String key="123";
System.out.println(" key="+key);
//输出 key=123
String value=DesUtils.encryption(key);
System.out.println("encryption value="+value);
//输出 encryption value=LDiFUdf0iew=
System.out.println("decrypt key="+DesUtils.decrypt(value));
//输出 decrypt key=123 }
}
以上为des 加密算法
以下为aes 可逆性加密算法
package com.lock.demo.service; import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; /**
* @author niunafei
* @function
* @email niunafei0315@163.com
* @date 2018/12/12 下午2:32
*/
public class AESUtils { private static final String AES="AES";
private static final String CHAR_SET_NAME1="UTF-8";
private static final String CHAR_SET_NAME2="ASCII";
private static final String CIPHER_KEY="AES/CBC/PKCS5Padding"; /**
* 加密用的Key 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,key需要为16位。
*/
private static final String IV_PARAMETER="a0.l954b_107x90l";
/**
* 可以用26个字母和数字组成 此处使用AES-128-CBC加密模式,需要为16位。
*/
private static final String S_KEY="ax7x90.3k_10li5u"; /**
* 加密
* @param param
* @return
* @throws Exception
*/
public static String encryption(String param) throws Exception {
Cipher cipher= Cipher.getInstance(CIPHER_KEY);
SecretKeySpec skeySpec = new SecretKeySpec(S_KEY.getBytes(), AES);
// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
// 此处使用BASE64做转码。
return new BASE64Encoder().encode(cipher.doFinal(param.getBytes(CHAR_SET_NAME1))); } /**
* 解密
* @param value
* @return
* @throws Exception
*/
public static String decrypt(String value) throws Exception {
SecretKeySpec skeySpec = new SecretKeySpec(S_KEY.getBytes(CHAR_SET_NAME2), AES);
Cipher cipher = Cipher.getInstance(CIPHER_KEY);
IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
// 先用base64解密
return new String(cipher.doFinal(new BASE64Decoder().decodeBuffer(value)), CHAR_SET_NAME1);
} /**
测试
*/
public static void main(String[] args) throws Exception {
String key="123";
System.out.println("key="+key);
//输出 key=123
String value=AESUtils.encryption(key);
System.out.println("encryption value="+value);
//输出 encryption value=OTslJ40Fa9a7ImOmCbmLPw==
System.out.println("decrypt key="+AESUtils.decrypt(value));
//输出 decrypt key=123 }
}
加密结果适用于url参数。 请使用异或可逆性算法 或者使用
URLEncoder.encode();
URLDecoder.decode() 进行转码即可
url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好?
解决办法
将这些字符转化成服务器可以识别的字符,对应关系如下:
URL字符转义
用其它字符替代吧,或用全角的。
+ URL 中+号表示空格 %2B
空格 URL中的空格可以用+号或者编码 %20
/ 分隔目录和子目录 %2F
? 分隔实际的URL和参数 %3F
% 指定特殊字符 %25
# 表示书签 %23
& URL 中指定的参数间的分隔符 %26
= URL 中指定参数的值 %3D
AES/DES 可逆性加密算法 -- java工具类的更多相关文章
- 关于RSA加密算法的工具类
关于RSA加密算法的工具类 最近在捣鼓SSO(单点登录),就是一个在应用(系统)登录之后,当切换其他应用(系统)的时候,可以省去登录,提高用户的使用的便捷.(具体有时间在写) 期间涉及的安全问题,发送 ...
- 第一章 Java工具类目录
在这一系列博客中,主要是记录在实际开发中会常用的一些Java工具类,方便后续开发中使用. 以下的目录会随着后边具体工具类的添加而改变. 浮点数精确计算 第二章 Java浮点数精确计算 crc32将任意 ...
- java工具类系列 (四.SerializationUtils)
java工具类系列 (四.SerializationUtils) SerializationUtils该类为序列化工具类,也是lang包下的工具,主要用于序列化操作 import java.io.Se ...
- Java工具类——通过配置XML验证Map
Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...
- 排名前 16 的 Java 工具类
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...
- 排名前16的Java工具类
原文:https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法 ...
- java工具类之按对象中某属性排序
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- 干货:排名前16的Java工具类
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...
- Java工具类:给程序增加版权信息
我们九天鸟的p2p网贷系统,基本算是开发完成了. 现在,想给后端的Java代码,增加版权信息. 手动去copy-paste,太没有技术含量. 于是,写了个Java工具类,给Java源文件 ...
随机推荐
- 【Unity3d】3d角色换装实现原理及步骤
http://www.cnblogs.com/dosomething/archive/2012/04/15/2450526.html 1.角色模型制作 unity3d支持Skin动画 但是不支持Ph ...
- Codeforces732F Tourist Reform
求出无向图的所有边双联通分量,然后缩点就成了一颗树. 然后我们选取最大的那个边双联通分量作为根,这样我们就可以确定所有割边的方向了. 对于边双联通分量里面的边,我们随便dfs一下就可以把它变成强连通分 ...
- 二分图最大匹配初探 By cellur925
一.什么是二分图 首先它需要是一张无向图. 之后它需要同时满足两个条件:①它的N个点被分为两个集合,且这两个集合交集为空:②同一集合内的点之间没有边相连. 二.无向图是否为二分图的判定 引理:无向图是 ...
- python之os、sys和random模块
import os # print(os.getcwd())#获取当前目录,绝对路径# print(os.chdir('../'))#更改当前目录,../的意思是退回上一级目录# print(os.g ...
- Hdu 5458 Stability (LCA + 并查集 + 树状数组 + 缩点)
题目链接: Hdu 5458 Stability 题目描述: 给出一个还有环和重边的图G,对图G有两种操作: 1 u v, 删除u与v之间的一天边 (保证这个边一定存在) 2 u v, 查询u到v的路 ...
- LCA UESTC 92 Journey
题目传送门 题意:先给一棵树,然后有一条额外的边,问u走到v从现在最短的路走和原来不加边走的路节省了多少距离 分析:首先跑不加边的树的LCA,这样能求出任意两点的距离,那么现在x和y多连了一条边,如果 ...
- Android-apk文件反编译
一:工具介绍及下载 1:apktool 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 2:dex2jar 作用:将apk反编译成java源码(classes ...
- 18.3.2从Class上获取信息(内部类接口等)
内部类 接口.枚举.注释类型
- 根据 目录号 案卷号 用户名 查询 page 中 的条数
select count(*) from am_b_page a join am_b_entry b on a.entry_id=b.entry_id where b.catalogue_code=' ...
- awr 收集时间
windows 收集 awr 报告,一分钟一个.