1.叙述

java security包下有很多加密算法类,我们可以很简单的调用它们。他们虽然功能很全,但是使用起来步骤有些繁琐。我在这里封装来一些常用的加密算法及他们常用的一些方法,来简化代码。

工具类结构如下:

调用步骤:

1.Client为调用类,统一调用加密门面对象(EncrypFacade),通过加密门面对象的对应方法,可以选择构建出对称加密门面对象(SymmetryFacade)、非对称加密门面对象(NoSymmetryFacade)、其他加密门面对象(OtherFacade)。

2.对称加密和非对称加密需要密钥,在构建时先生成密钥,然后再构建对象(HMAC比较特殊,是需要公钥加密的哈希算法),这些对象构建使用门面对象中的builder结尾的方法。而其他加密算法则直接使用OtherFacade对象的对应方法实现加密解密,OtherFacade会根据具体方法调用具体加密对象的方法,这些加密对象再调各自的Handle。

3.使用builder方法得到加密对象后调用具体方法实现加密解密,这些方法在各自调用的Handler中。

优点:

虽然我们在开发中一般不会用到多种加密算法,但是各个类的成员都做了延时加载,在调用时才会生成实例对象,所以不用担心类膨胀。相反的,我们更容易拓展它。

2.示例

2.1 Base64的使用

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String base64 = otherFacade.Base64(text);
System.out.println("base64加密后的密文为:"+base64);
String base64Decrypt = otherFacade.Base64Decrypt(base64);
System.out.println("base64解密后的明文为:"+base64Decrypt);

byte[] data = "123qwe!@#".getBytes();
  System.out.println("data:"+Arrays.toString(data));
  OtherFacade otherFacade = EncrypFacade.getOtherFacade();
  byte[] base64 = otherFacade.Base64(data);
  System.out.println("Base64加密字节数组结果为:"+Arrays.toString(base64));
  byte[] base64Decrypt = otherFacade.Base64Decrypt(base64);
  System.out.println("Base64解密字节数组结果为:"+Arrays.toString(base64Decrypt));

代码1:

代码2:

 2.2 MD5的使用

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String md5 = otherFacade.MD5(text);
System.out.println("md5加密后的密文为:"+md5);

byte[] data = "123qwe!@#".getBytes();
  System.out.println("data:"+Arrays.toString(data));
  OtherFacade otherFacade = EncrypFacade.getOtherFacade();
  byte[] md5 = otherFacade.MD5(data);
  System.out.println("md5加密字节数组结果为:"+Arrays.toString(md5));

代码1:

代码2:

 2.3 SHA的使用

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String sha = otherFacade.SHA(text);
System.out.println("SHA加密后的密文为:"+sha);
byte[] data = "123qwe!@#".getBytes();
System.out.println("data:"+Arrays.toString(data));
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
byte[] sha = otherFacade.SHA(data);
System.out.println("SHA加密字节数组结果为:"+Arrays.toString(sha));

代码1:

代码2:

 2.4 CP的使用

这个加密算法为本人自创的一种算法,它其实就是结合了其他几种加密的杂合版。

下面这个实例为可解密的CP加密,加密时先使用base64,再用innovate加密,而解密则是先innovate再base64,innovate是我随便启动名字,至于这个算法,我找度娘要的。而innovate加密算法我并没有在门面对象中公开。

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String cp = otherFacade.CP(text);
System.out.println("CP加密后的密文为:"+cp);
String cpDecrypt = otherFacade.CPDecrypt(cp);
System.out.println("CP解密后的明文为:"+cpDecrypt);

结果:

下面这个实例为不可逆加密,它会使用4种算法多重加密,有MD5、Base64、SHA、innovate,通过自定义的内部算法用盐值来确定这几种算法的加密顺序,也就是说加密的明文相同,盐值不同也会导致密文不同。

String text = "123qwe!@#";
String salt = "userName";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
String cp = otherFacade.CP(salt, text);
System.out.println("CP加密后的密文为:"+cp);

结果:

 2.5 HMAC的使用

String text = "123qwe!@#";
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
HMAC hmac1 = otherFacade.HMACBuilder();
SymmetryKey key = hmac1.getKey();
System.out.println("HMAC生成的key为:"+key.getPublicKey());
String encrypt1 = hmac1.Encrypt(text);
System.out.println("A使用HMAC加密结果为:"+encrypt1);
//模拟A将key传递给B
HMAC hmac2 = otherFacade.HMACBuilder(key);
//HMAC hmac2 = otherFacade.HMACBuilder(key.getPublicKey());//同上
String encrypt2 = hmac2.Encrypt(text);
System.out.println("B使用HMAC加密结果为:"+encrypt2);
byte[] data = "123qwe!@#".getBytes();
System.out.println("data:"+Arrays.toString(data));
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
HMAC hmac1 = otherFacade.HMACBuilder();
SymmetryKey key = hmac1.getKey();
System.out.println("HMAC生成的key为:"+key.getPublicKey());
byte[] encrypt1 = hmac1.Encrypt(data);
System.out.println("A使用HMAC加密字节数组结果为:"+Arrays.toString(encrypt1));
//模拟A将key传递给B
HMAC hmac2 = otherFacade.HMACBuilder(key);
//HMAC hmac2 = otherFacade.HMACBuilder(key.getPublicKey());//同上
byte[] encrypt2 = hmac2.Encrypt(data);
System.out.println("B使用HMAC加密字节数组结果为:"+Arrays.toString(encrypt2));

代码1:

代码2:

2.6 AES的使用

String text = "123qwe!@#";
SymmetryFacade symmetryFacade = EncrypFacade.getSymmetryFacade();
AES aes1 = symmetryFacade.AESBuilder();
SymmetryKey key = aes1.getKey();
System.out.println("AES生成的key为:"+key.getPublicKey());
String encrypt = aes1.Encrypt(text);
System.out.println("A使用AES加密结果为:"+encrypt);
//模拟A将key传递给B
AES aes2 = symmetryFacade.AESBuilder(key);
//AES aes2 = symmetryFacade.AESBuilder(key.getPublicKey());//同上
String decrypt = aes2.Decrypt(encrypt);
System.out.println("B使用AES解密结果为:"+decrypt);
byte[] data = "123qwe!@#".getBytes();
System.out.println("data:"+Arrays.toString(data));
SymmetryFacade symmetryFacade = EncrypFacade.getSymmetryFacade();
AES aes1 = symmetryFacade.AESBuilder();
SymmetryKey key = aes1.getKey();
System.out.println("AES生成的key为:"+key.getPublicKey());
byte[] encrypt = aes1.Encrypt(data);
System.out.println("A使用AES加密结果为:"+Arrays.toString(encrypt));
//模拟A将key传递给B
AES aes2 = symmetryFacade.AESBuilder(key);
//AES aes2 = symmetryFacade.AESBuilder(key.getPublicKey());//同上
byte[] decrypt = aes2.Decrypt(encrypt);
System.out.println("B使用AES解密结果为:"+Arrays.toString(decrypt));

代码1:

代码2:

 2.7 RES的使用

我们先来了解下数字签名和非对称加密过程

1.数字签名:

数字签名是笔迹签名的模拟,用于保证信息传输的完整性、发送者身份认证,以及防止交易中抵赖行为等。

 公钥签名体制的基本思路是:

  ①发送者A用自己的私钥加密信息,从而对文件签名

  ②将签名的文件发送给接受者B

  ③B利用A的公钥(可以从CA机构等渠道获得)解密文件,从而验证签名。

2.非对称加密过程

 A与B之间要进行加密通信,非对称加密流程是:

  ①A与B都要产生一对用于加密和解密的加密密钥和解密密钥

  ②A生成一对密钥,将公用密钥向其他方公开。将公钥传送给B,将私钥自己保管。B将公钥传送给A,将私钥自己保管。

  ③A发送消息给B时,先用B的公钥对信息进行加密,再将密文发送给B

  ④B收到A发来的消息时,用自己的私钥解密

  注意:A和B都只能用其专用私钥加密由其公钥加密后的任何信息。

String text = "123qwe!@#";
NoSymmetryFacade noSymmetryFacade = EncrypFacade.getNoSymmetryFacade();
//512为公钥长度,理论上长度越长越难被破解,如果不填参数默认为1024,若小于512则使用默认值
RSA res1 = noSymmetryFacade.RESBuilder(512);
NoSymmetryKey key1 = res1.getKey();
RSA res2 = noSymmetryFacade.RESBuilder(512);
NoSymmetryKey key2 = res2.getKey();
//交换publicKey
res1.setKey(key2);
res2.setKey(key1);
//res1.setKey(key2.getPublicKey());//同上
//res2.setKey(key1.getPublicKey());//同上
//A先使用B的公钥加密,然后再使用自己的私钥加密
String privateEncrypt = res1.privateEncrypt(res1.publicEncrypt(text));
//生成签名
String sign1 = res1.sign(privateEncrypt);
System.out.println("A的RSA公钥为:"+key1.getPublicKey());
System.out.println("B的RSA公钥为:"+key2.getPublicKey());
System.out.println("A的RSA签名为:"+sign1);
System.out.println("A使用RSA加密数据为:"+privateEncrypt);
//B得到签名及加密数据
//先验证签名,判断数据是否被改动过
if(res2.verify(privateEncrypt, sign1)){
//然后解密
//先用A的公钥解密,再用B的私钥解密,顺序与加密相反
String publicDecrypt = res2.privateDecrypt(res2.publicDecrypt(privateEncrypt));
System.out.println("B使用RSA解密数据为:"+publicDecrypt);
}
byte[] data = "123qwe!@#".getBytes();
System.out.println("data:"+Arrays.toString(data));
NoSymmetryFacade noSymmetryFacade = EncrypFacade.getNoSymmetryFacade();
//512为公钥长度,理论上长度越长越难被破解,如果不填参数默认为1024,若小于512则使用默认值
RSA res1 = noSymmetryFacade.RESBuilder(512);
NoSymmetryKey key1 = res1.getKey();
RSA res2 = noSymmetryFacade.RESBuilder(512);
NoSymmetryKey key2 = res2.getKey();
//交换publicKey
res1.setKey(key2);
res2.setKey(key1);
//res1.setKey(key2.getPublicKey());//同上
//res2.setKey(key1.getPublicKey());//同上
//A先使用B的公钥加密,然后再使用自己的私钥加密
byte[] privateEncrypt = res1.privateEncrypt(res1.publicEncrypt(data));
//生成签名
byte[] sign1 = res1.sign(privateEncrypt);
System.out.println("A的RSA公钥为:"+key1.getPublicKey());
System.out.println("B的RSA公钥为:"+key2.getPublicKey());
System.out.println("A的RSA签名为:"+Arrays.toString(sign1));
System.out.println("A使用RSA加密数据为:"+Arrays.toString(privateEncrypt));
//B得到签名及加密数据
//先验证签名,判断数据是否被改动过
if(res2.verify(privateEncrypt, sign1)){
//然后解密
//先用A的公钥解密,再用B的私钥解密,顺序与加密相反
byte[] publicDecrypt = res2.privateDecrypt(res2.publicDecrypt(privateEncrypt));
System.out.println("B使用RSA解密数据为:"+Arrays.toString(publicDecrypt));
}

代码1:

代码2:

下载地址:

https://github.com/chengpu2/java_eclipse1

写一个java常用的加密工具类的更多相关文章

  1. Java常用的加密解密类(对称加密类)

    Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...

  2. 一个java的DES加密解密类转换成C#

    一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //import java.util.regex.P ...

  3. java实现Md5加密工具类

    场景:平常我们用户注册的密码保存到数据库都不会是明文存储的.都是经过加密之后的.因为保证用户的安全性.我们通常是用md5算法来加密的. 这个只能算是一个工具类.没必要了解里面是怎么实现的.拿来用就可以 ...

  4. java常用正则校验工具类

    正则常用校验工具类 import java.util.regex.Pattern; /** * @program: * @description: 校验工具类 * @author: xujingyan ...

  5. Java常用API——Arrays工具类

    介绍:Arrays工具类提供了一些可以直接操作数组的方法,以下是一些常用方法: int binarySearch(type[] a, type key):要求数组a元素升序排列,使用二分法搜索key的 ...

  6. java 常用Bean 转换工具类

    package com.hnf.framework.utils; import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.data ...

  7. Java常用正则表达式验证工具类RegexUtils.java

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexUtils{ /** * 正则表达式 ...

  8. java中MessageDigest加密工具类

    import java.security.MessageDigest; public class EncryptionKit { public static String md5Encrypt(Str ...

  9. Java AES 加密工具类

    package com.microwisdom.utils; import java.security.NoSuchAlgorithmException; import java.security.S ...

随机推荐

  1. 杭电2019多校第八场 Acesrc and Good Numbers——思维打表&&oeis

    题意 给定 $d,x$,$f(d,k)$ 表示 $1 \sim k$ 中 $d$ 出现的次数, $k$ 满足 $f(d,k) = k$,求小于 $x$ 的最大的 $k$. 分析 正解不会...,学习了 ...

  2. LightOJ - 1078-Integer Divisibility(同余)

    链接: https://vjudge.net/problem/LightOJ-1078 题意: If an integer is not divisible by 2 or 5, some multi ...

  3. 005_硬件基础电路_PCB安规设计规范

    包含两个文件:讲解pcb绘制过程中的安规要求 002_2_PCB安规设计规范(原创-绝对经典全面-玩转高压PCB设计)总结 002_3_电气间隙和爬电距离规定 链接:https://pan.baidu ...

  4. 2019-2020 ICPC, Asia Jakarta Regional Contest

    目录 Contest Info Solutions A. Copying Homework C. Even Path E. Songwriter G. Performance Review H. Tw ...

  5. Jupyter开发环境搭建

    小书匠kindle 目录: 1.Jupyter 介绍 2.Jupyter安装 3.notedown插件安装 4.扩展包安装 5.运行Jupyter 6.在远端服务器上运行jupyter 1.Jupyt ...

  6. <frame>、<iframe>、<embed>、<object> 和 <applet>

    frame frame 必须在 frameset 里,而 frameset 又不能和 body 共存(就是一旦存在 frame,就不能存在 body 了,因此这个基本每人使用) 推荐阅读:https: ...

  7. OpenJudge 1.5.36:计算多项式的值

    描述 假定多项式的形式为xn+xn-1+…+x2+x+1,请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值. 输入输入仅一行,包括x和n,用单个空格隔开.x在float范围内,n <= ...

  8. zoom:1的常见作用

    zoom是IE专用属性,firefox等是不支持的.它的本来作用是设置或检索对象的缩放比例,但这作用几乎用不到. 可以让网页实现IE7中的放大缩小功能.比如你想让你的网页缩小为原来的一半,那么就在bo ...

  9. Metaspace 之二--PermGen vs. Metaspace 运行时比较

    PermGen vs. Metaspace 运行时比较 为了更好地理解Metaspace内存空间的运行时行为, 将进行以下几种场景的测试: 使用JDK1.7运行Java程序,监控并耗尽默认设定的85M ...

  10. 迭代器Iterator、for循环遍历、泛型

    java.util.Collection接口 是集合的最顶层的接口,定义了集合共性的方法 接口无法直接创建对象,使用多态的方式创建对象 Collection<集合中的数据类型(泛型)> c ...