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工具类的更多相关文章

  1. 关于RSA加密算法的工具类

    关于RSA加密算法的工具类 最近在捣鼓SSO(单点登录),就是一个在应用(系统)登录之后,当切换其他应用(系统)的时候,可以省去登录,提高用户的使用的便捷.(具体有时间在写) 期间涉及的安全问题,发送 ...

  2. 第一章 Java工具类目录

    在这一系列博客中,主要是记录在实际开发中会常用的一些Java工具类,方便后续开发中使用. 以下的目录会随着后边具体工具类的添加而改变. 浮点数精确计算 第二章 Java浮点数精确计算 crc32将任意 ...

  3. java工具类系列 (四.SerializationUtils)

    java工具类系列 (四.SerializationUtils) SerializationUtils该类为序列化工具类,也是lang包下的工具,主要用于序列化操作 import java.io.Se ...

  4. Java工具类——通过配置XML验证Map

    Java工具类--通过配置XML验证Map 背景 在JavaWeb项目中,接收前端过来的参数时通常是使用我们的实体类进行接收的.但是呢,我们不能去决定已经搭建好的框架是怎么样的,在我接触的框架中有一种 ...

  5. 排名前 16 的 Java 工具类

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  6. 排名前16的Java工具类

    原文:https://www.jianshu.com/p/9e937d178203 在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法 ...

  7. java工具类之按对象中某属性排序

    import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...

  8. 干货:排名前16的Java工具类

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类.以下工具类.方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码. 一. ...

  9. Java工具类:给程序增加版权信息

       我们九天鸟的p2p网贷系统,基本算是开发完成了.   现在,想给后端的Java代码,增加版权信息.   手动去copy-paste,太没有技术含量. 于是,写了个Java工具类,给Java源文件 ...

随机推荐

  1. CSS3向外扩散的圆

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  2. 题解报告:hdu 4135 Co-prime(容斥定理入门)

    Problem Description Given a number N, you are asked to count the number of integers between A and B ...

  3. 泛型generic

  4. HBase文档操作--练习篇

    1.查询学生的所有信息 数据准备 var persons = [{ name:"jim", age:25, email:"75431457@qq.com", c ...

  5. MongoDB学习笔记~监控Http请求的消息链

    在微服务架构里,你的一个任务可以需要经过多次中转,去多个接口获取数据,而在这个过程中,出现问题后的解决就成了一个大难点,你无法定位它的问题,这时,大叔的分布式消息树就出现了,费话不多说,主要看一下实现 ...

  6. jquery 选择器包含特殊字符

    选择器包含 : .# ( ] 等等 比如 <div id="id#a"></div> <div id="id[1]">< ...

  7. 如何在Windows2008 Server服务器上开启Ping或者禁PING

    方法1:命令行模式 进入服务器后 点击 开始--运行 输入命令: netsh firewall set icmpsetting 8 这样就可以在外部ping到服务器了 非常简单实用! 同样道理,如果想 ...

  8. zoj3772Calculate the Function(矩阵+线段树)

    链接 表达式类似于斐波那契 但是多了一个变量 不能用快速幂来解 不过可以用线段树进行维护 对于每一个点够一个2*2的矩阵 1 a[i] 1  0   这个矩阵应该不陌生 类似于构造斐波那契的那个数列 ...

  9. H5图片预览功能

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  10. 外文翻译 《How we decide》多巴胺的预言 第三节

    这是第二章的最后一节. 书的导言 本章第一节 本章第二节 本节阅读感言:自我批评是自我提升的妙方. 多巴胺是我们感情的源泉.多巴胺相关的神经系统在不断的记录着我们主观意识没有注意到的一个个模式,将它们 ...