非对称加密好处, 就是可以公钥加密, 私钥解密, 或是私钥加密,公钥验签, 双向互信. 公钥对外不保密.也保证了秘钥安全.
hutool加解密文档地址
非对称加密-AsymmetricCrypto | Hutool
官方demo如下
RSA rsa = new RSA();
//获得私钥
rsa.getPrivateKey();
rsa.getPrivateKeyBase64();
//获得公钥
rsa.getPublicKey();
rsa.getPublicKeyBase64();
//公钥加密,私钥解密
byte[] encrypt = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
byte[] decrypt = rsa.decrypt(encrypt, KeyType.PrivateKey);
//Junit单元测试
//Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8));
//私钥加密,公钥解密
byte[] encrypt2 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PrivateKey);
byte[] decrypt2 = rsa.decrypt(encrypt2, KeyType.PublicKey);
//Junit单元测试
//Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt2, CharsetUtil.CHARSET_UTF_8));
1. 可以new RSA对象生成随机密钥对, 对内容加解密
2. 使用公钥,私钥生成RSA对象, 加解密内容
3. 加密内容可以通过base64由byte[]数组转字符串进行网络传播
@Test
public void test3() {
RSA rsa = new RSA();
rsa.getPrivateKey();
// 可以获取私钥字符串用于保存
String privateKeyBase64 = rsa.getPrivateKeyBase64();
System.out.println("privatekey-->"+privateKeyBase64);
rsa.getPublicKey();
// 获取公钥字符串用于存储
String publicKeyBase64 = rsa.getPublicKeyBase64();
System.out.println("publickey-->"+publicKeyBase64);
//加密内容byte[]处理
byte[] aByte = StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8);
System.out.println(new String(aByte));
//byte[]内容加密
byte[] encrypt = rsa.encrypt(aByte, KeyType.PublicKey);
//加密后base64处理用于网络传输
String encStr=Base64.encode(encrypt);
System.out.println("加密串--"+encStr);
//网络另一方收到内容进行base64解密 转加密的byte数组
byte[] bytes = Base64.decode(encStr);
//对byte数组进行解密
byte[] decrypt = rsa.decrypt(bytes, KeyType.PrivateKey);
//解密内容生成字符串
System.out.println(StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8));
Assert.assertEquals("我是一段测试aaaa", StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8));
}
4. 解密
RSA rsa = new RSA(privateKey, null);
//加密后base64处理用于网络传输
byte[] bytes = Base64.decode(params.get("encrypt"));
//对byte数组进行解密
byte[] decrypt = rsa.decrypt(bytes, KeyType.PrivateKey);
//解密内容生成字符串
JSONObject jo = JSONObject.parseObject(StrUtil.str(decrypt, CharsetUtil.CHARSET_UTF_8));
5. 私钥签名, 公钥验签
secureUtil.sign生成sign对象, sign对象签名
byte[] encrypt = rsa.encrypt(aByte, KeyType.PublicKey);
Sign sign = SecureUtil.sign(SignAlgorithm.SHA256withRSA, rsa.getPrivateKey().getEncoded(),null);
//签名
byte[] signed = sign.sign(encrypt);
//验证签名
Sign sign2 = SecureUtil.sign(SignAlgorithm.SHA256withRSA, null,rsa.getPublicKey().getEncoded());
boolean verify = sign2.verify(encrypt, signed);
System.out.println("验签-->"+verify);