专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 写一个Java加密工具

写一个Java加密工具

更新时间:2021-10-21 10:17:23 来源:动力节点 浏览588次

Java加密工具是Java开发工具之一,java安全包下有很多加密算法类,我们可以简单的调用它们。它们虽然功能齐全,但使用起来有点麻烦。在这里封装了一些常用的加密算法及其常用方法,以简化代码。

工具类的结构如下:

调用步骤:

1.client为调用类,统一调用encrypfacade。通过相应的门面对象加密方法,可以选择构建对称、非对称等加密门面对象。

2.对称加密和非对称加密都需要密钥。构造时生成密钥,然后构造对象(HMAC比较特殊,是一种需要公钥加密的哈希算法)。这些对象是使用外观对象中的构建器结束方法构造的。其他加密算法直接使用OtherFacade对象的对应方法来实现加解密。OtherFacade 会根据具体的方法调用具体的加密对象的方法,这些加密对象会调用各自的句柄。

3.使用builder方法获取加密对象,然后调用具体方法实现加解密。这些方法在它们相互调用的处理程序中。

优势:

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

例子

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("数据:"+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));

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("数据:"+Arrays.toString(data));
  OtherFacade otherFacade = EncrypFacade.getOtherFacade();
  byte[] md5 = otherFacade.MD5(data);
  System.out.println("md5 加密字节数组的结果为:"+Arrays.toString(md5));

3.沙的使用

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

4.CP的使用

该加密算法为自制算法。它实际上是其他加密的混合版本。

下面的例子是可以解密的CP加密。加密时先用base64,再用innovation。解密的时候,创新是我随意起的名字。

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);

以下示例是不可逆加密。它使用了四种多重加密算法,MD5、Base64、SHA 和创新。这些算法的加密顺序由用户定义的内部算法的salt值决定。也就是说,加密后的明文是一样的,不同的salt值会导致不同的密文。

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

5.HMAC的使用

String text = "123qwe!@#" ;
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
HMAC hmac1 = otherFacade.HMACBuilder();
SymmetryKey key = hmac1.getKey();
System.out.println( "HMAC 生成的密钥为:"+ key.getPublicKey());
字符串 encrypt1 = hmac1.Encrypt(text);
System.out.println( "A使用HMAC加密结果为:"+ encrypt1);
//模拟 A 将密钥传递给 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( "数据:"+ Arrays.toString(data));
OtherFacade otherFacade = EncrypFacade.getOtherFacade();
HMAC hmac1 = otherFacade.HMACBuilder();
SymmetryKey key = hmac1.getKey();
System.out.println( "HMAC 生成的密钥为:"+ key.getPublicKey());
字节[] encrypt1 = hmac1.Encrypt(data);
System.out.println( "一个使用HMAC加密的字节数组的结果是:"+ Arrays.toString(encrypt1));
//模拟 A 将密钥传递给 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));

6.AES的使用

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

7.资源的使用

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

(1)数字签名:

数字签名是对手写签名的模拟,用于保证信息传输的完整性、发送方的身份认证、防止交易中的抵赖。

公钥签名系统的基本思想如下:

1)发件人A用自己的私钥对信息进行加密,对文件进行签名

2)将签署的文件发送给接收方 B

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

(2)非对称加密过程

A和B之间需要加密通信,非对称加密过程如下:

1)A 和 B 都需要生成一对加解密密钥进行加解密

2)A 生成一对密钥,并将公钥公开给其他方。将公钥传递给 B 并保留私钥。B 将公钥传输给 A 并保留私钥。

3)当 A 向 B 发送 A 消息时,它用 B 的公钥对消息进行加密,然后将密文发送给 B

4)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( "一个使用RSA加密的数据是:"+ privateEncrypt);
// B 获取签名和加密数据
//先验证签名,判断数据是否有变化
if (res2.verify(privateEncrypt, sign1)){
     //然后解密
    //先用 A 解密 B 的公钥 Decrypt与加密相反的私钥
    String publicDecrypt = res2.privateDecrypt(res2.publicDecrypt(privateEncrypt));
    System.out.println( "B 使用 RSA 解密后的数据为:"+ publicDecrypt);
}
byte [] data = "123qwe!@#" .getBytes ();
System.out.println( "数据:"+ 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));
//生成签名
字节[] 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( "一个使用RSA加密的数据是:"+ Arrays.toString(privateEncrypt));
// B 获取签名和加密数据
//先验证签名,判断数据是否有变化
if (res2.verify(privateEncrypt, sign1)){
     //然后解密
    //先用 A 解密 B 的公钥 Decrypt与加密
    字节相反的私钥[] publicDecrypt = res2.privateDecrypt(res2.publicDecrypt(privateEncrypt));
    System.out.println( "B 使用 RSA 解密后的数据为:"+ Arrays.toString(publicDecrypt));
}

大家如果对此感兴趣,想了解更多相关知识,可以来关注一下动力节点的Java在线学习,里面有更多的知识在等着大家去学习,相信对大家会有一定的帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>