前言
网上搜非对称加密,里面详解说的的确很详细,公式都拉出来了,本文通过简单易懂的方式讲解非对称加密
什么是非对称加密?
对称加密
先了解一下对称加密,对称加密就是客户端和服务端都有一个共同的秘钥(可以理解为就是字符串);
客户端用秘钥对要传输的明文参数进行加密,生成一段秘文,用秘文来与服务端传输,这样即使中间被劫持,也无法看到原文;
服务端拿到秘文后,再用秘钥进行解密,就可以拿到原文了,着整个过程就叫“对称式加密”;
但是里面存在一个不安全问题,如果哪天客户端的秘钥被暴露了,那么传输中的秘文就可以被解密得到原文;
非对称加密
刚才说了对称加密以及存在的问题,后来为了解决这一问题,就出现了“非对称式加密”,就是服务端提前生成好一对秘钥,也就是两个秘钥, 一个作为公钥(就是公开全球人都可以知道的),另个作为私钥(这个是私有的,打死都不能说的);
将公钥交给客户端,客户端使用公钥进行加密,生成秘文传输给服务端,服务端用私钥进行解密就可以得到原文;
这样即使公钥暴露出去了,那么传输中的秘文也不会被解开。
我们常见的非对称加密有RSA
(注意:上面所说只是简单地使用,客户端和服务端,其实应用起来可以更灵活,可以是多个服务端之间通讯,各自生成自己的公私钥,将自己的公钥公布出去,私钥留着自己解密使用。)
java示例
hutool-RSA加密使用示例
// 提前导入jar包 hutool-all
// 获取一对RSA的公秘钥
KeyPair pair = SecureUtil.generateKeyPair("RSA");
String privateKeyBase64 = Base64.encode(pair.getPrivate().getEncoded());
System.out.println(privateKeyBase64);
String publicKeyBase64 = Base64.encode(pair.getPublic().getEncoded());
System.out.println(publicKeyBase64);
// 公钥加密 私钥解密
RSA rsa = new RSA(privateKeyBase64, publicKeyBase64);
String hello_world = rsa.encryptBase64("hello world", KeyType.PublicKey);
System.out.println("密文:" + hello_world);
String decrypt = rsa.decryptStr(hello_world, KeyType.PrivateKey);
System.out.println("解密:"+decrypt);