更新时间:2021-10-21 10:17:23 来源:极悦 浏览650次
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极悦在线学习,里面有更多的知识在等着大家去学习,相信对大家会有一定的帮助。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习