前言

        网上搜非对称加密,里面详解说的的确很详细,公式都拉出来了,本文通过简单易懂的方式讲解非对称加密

什么是非对称加密?

对称加密

        先了解一下对称加密,对称加密就是客户端和服务端都有一个共同的秘钥(可以理解为就是字符串);

        客户端用秘钥对要传输的明文参数进行加密,生成一段秘文,用秘文来与服务端传输,这样即使中间被劫持,也无法看到原文;

        服务端拿到秘文后,再用秘钥进行解密,就可以拿到原文了,着整个过程就叫“对称式加密”;

        但是里面存在一个不安全问题,如果哪天客户端的秘钥被暴露了,那么传输中的秘文就可以被解密得到原文;

非对称加密

        刚才说了对称加密以及存在的问题,后来为了解决这一问题,就出现了“非对称式加密”,就是服务端提前生成好一对秘钥,也就是两个秘钥, 一个作为公钥(就是公开全球人都可以知道的),另个作为私钥(这个是私有的,打死都不能说的);

        将公钥交给客户端,客户端使用公钥进行加密,生成秘文传输给服务端,服务端用私钥进行解密就可以得到原文;

        这样即使公钥暴露出去了,那么传输中的秘文也不会被解开。

        我们常见的非对称加密有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);