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. Unity Transform常识(转)

    Variables   position: Vector3  物体在世界坐标中的位置. transform.position=Vector3(10,10,10)//把物体放到(x=10,y=10,z= ...

  2. bzoj 1982: [Spoj 2021]Moving Pebbles【博弈论】

    必败状态是n为偶数并且数量相同的石子堆可以两两配对,因为这样后手可以模仿先手操作 其他状态一定可以由先手给后手一步拼出一个必败状态(用最大堆补) #include<iostream> #i ...

  3. IT兄弟连 Java Web教程 经典面试题2

    1.Servlet的工作流程? Servlet是运行在Servlet容器中的,由Servlet容器来负责Servlet实例的查找.创建以及整个生命周期的管理,Servlet整个生命周期可以分为四个阶段 ...

  4. 第十三篇 .NET高级技术之事件

    案例:定一个Person类,定一个监听年龄变化的事件,当本命年的时候祝贺一下.触发事件的地方要判断一下是不是事件null 事件语法:event Mydelegate mdl; 加了event关键字实现 ...

  5. SpringBoot的配置文件加载顺序以及如何获取jar包里的资源路径

    一.读取配置文件的四种方式 这四种配置文件放置方式的读取优先级依次递减,具体可以查看官方文档. 1.1jar包同级目录下的config文件夹里的配置文件 其实我以前就见过这种方式了,只是不知道怎么做的 ...

  6. 交表(Send a Table)

    #include<stdio.h> #include<string.h> #define N 50010 int phi[N],n,sum[N]; void phi_table ...

  7. springMVC validator验证的使用

    http://blog.csdn.net/miketom155/article/details/45058195 1. 实现Validator接口,对数据进行校验 @RequestMapping(va ...

  8. Reference for shell scripting

    ${var} 和 $var的区别 http://stackoverflow.com/questions/8748831/when-do-we-need-curly-braces-in-variable ...

  9. AWK整理

    处理模式: awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作.如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如 ...

  10. DedeCMS全版本通杀SQL注入漏洞利用代码及工具

    dedecms即织梦(PHP开源网站内容管理系统).织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,近日,网友 ...