在前面的文章中讲述过使用公钥加密、私钥解密的使用示例,同时也介绍过使用私钥对文件进行签名,使用公钥进行验证的示例。这篇文章继续来讨论一下应该是公钥加密还是私钥加密的问题。
首先关于公钥、私钥又如下基本常识:
- 公钥:可发放给多个持有人,是被公开的钥匙
- 私钥:必须严格管理,一般只有一个持有人,是不能被公开的钥匙
- 长度:长度越长,安全性越高,速度越慢
- 关系:公钥数据是包含在私钥之中的,可以根据私钥可以生成公钥
- 加密解密:公钥和私钥都可以用于加密、解密操作
虽然公钥和私钥都可以用于加密和解密,但是实际上公钥加密、私钥解密还是私钥加密、公钥解密这实际上并不是一个问题。因为公钥是被公开的,使用私钥进行加密,公钥进行解密,在传输的过程中谁都可以获取到这个信息并对其使用公钥进行解密,所以这不是加密和解密的场景,因为这个过程注定无法保密,这个过程是用于验证发送者的身份的,因为在网络上的信息是可以被获取和篡改的,如果私钥只有一人拥有,使用私钥进行加密,获取到这个加密后的数据之后,拿着公钥进行解密,如果能够解开,说明了发送者的身份就是私钥的拥有者,而这种身份的证明和不可抵赖性则是这个使用中最为重要的关注点,而传输的内容则不是关注的内容。 所以私钥加密、公钥解密这种情况更多的则是这样一种表述:私钥的拥有者使用私钥进行签名,而公钥的拥有者使用公钥对此签名进行验证,从而确认发送者的身份。其实从数据的流向也很清楚,从私钥的拥有者流向众多公钥的拥有者,主要是向拥有者进行身份的证明,安全性相关的数据的传输使用这种方式注定是得不到保障的。
公钥加密、私钥解密数据的流向相较于前面一种场景是相反的,公钥加密的数据,传输之后,收到数据的接收者使用私钥进行解密,由于私钥的持有人是严格管理的,所以正常情况下,一般人即使获取到使用公钥加密的数据也无法解开,所以数据的安全性是可以得到保障的。这也是非对称密钥算法最为常见的使用场景。
使用示例 公钥加密、私钥解密在前面的文章中已经通过具体的示例介绍过这种方式,使用rsautil提供的加密和解密的选项很清晰地描述的这个过程,详细可参看: *
私钥签名、公钥验签相较于私钥加密、公钥解密的说法,在实际的场景中,使用私钥的拥有者私钥进行签名、获取签名文件的公钥的拥有者对签名文件进行验证,以确认发送者身份和内容的完整性则是更符合常识上理解的说法。结合dgst命令,如下的文章介绍了这一过程:
- https://liumiaocn.blog.csdn.net/article/details/103457878
而rsautil也提供了类似的选项,而且选项的名称也直接是sign和verify,示例使用说明如下所示:
- sign: 私钥拥有者使用私钥对输入文件生成签名文件
- verify:公钥拥有者使用公钥对签名文件进行验证,获取sing之前的输入文件
准备如下文件,准备方法参看:https://liumiaocn.blog.csdn.net/article/details/103457878
[root@liumiaocn rsa]# ls -lrt total 20 -rw-r--r--. 1 root root 37 Dec 9 06:51 messages -rw-------. 1 root root 887 Dec 9 06:52 rsa_key.private -rw-r--r--. 1 root root 272 Dec 9 06:52 rsa_key.public -rw-r--r--. 1 root root 128 Dec 9 06:58 enc_messages -rw-r--r--. 1 root root 37 Dec 9 06:59 dec_messages [root@liumiaocn rsa]#
本示例使用到的文件说明:
- messages:加密对象文件,保存hello的信息
- rsa_key.private: 私钥
- rsa_key.public:公钥
使用私钥进行签名:
[root@liumiaocn rsa]# openssl rsautl -sign -in messages -out messages.sign -inkey rsa_key.private [root@liumiaocn rsa]# ls -l messages.sign -rw-r--r--. 1 root root 128 Dec 9 07:39 messages.sign [root@liumiaocn rsa]#使用公钥对签名进行验证
[root@liumiaocn rsa]# openssl rsautl -verify -in messages.sign -pubin -inkey rsa_key.public Hello, this is greeting from liumiao [root@liumiaocn rsa]# openssl rsautl -verify -in messages.sign -pubin -inkey rsa_key.public -out verify_messages [root@liumiaocn rsa]# cat verify_messages Hello, this is greeting from liumiao [root@liumiaocn rsa]#