前篇文章介绍如何使用对称加密算法来对文件进行加密和解密操作,这篇文章以RSA为例介绍非对称加密算法的使用方式。
场景说明: 在前面的文章中介绍了签名的方式:https://liumiaocn.blog.csdn.net/article/details/103457878。在文章中提到了如何使用公钥和签名文件进行签名的验证,由于签名验证方式只用到了签名文件和公钥,而一同发送的另外一个文件messages则没有使用,如果签名文件在中途被修改了,使用者使用公钥进行签名验证时会提示验证无法通过。但是messages文件没有被修改则没有保证,这篇文章继续介绍一下保证messages文件在传输过程中不被修改的方法,使用的算法为非对称加密算法。
加密解密流程无论是对称加密算法还是非对称加密算法整体流程都是一致的,加密解密的一般流程如下所示:
RSA是典型的非对称加密算法,这里以RSA算法为例进行文件加密和解密的说明。
事前准备准备如下的messages文件,或者其他任意用来验证的文件均可。
[root@liumiaocn rsa]# echo "Hello, this is greeting from liumiao" >messages [root@liumiaocn rsa]# cat messages Hello, this is greeting from liumiao [root@liumiaocn rsa]#
- 准备私钥文件
[root@liumiaocn rsa]# openssl genrsa -out rsa_key.private 1024 Generating RSA private key, 1024 bit long modulus (2 primes) .+++++ .....................+++++ e is 65537 (0x010001) [root@liumiaocn rsa]# [root@liumiaocn rsa]# ls -l total 8 -rw-r--r--. 1 root root 37 Dec 9 06:51 messages -rw-------. 1 root root 887 Dec 9 06:52 rsa_key.private [root@liumiaocn rsa]#
- 准备公钥文件 从私钥中提取如下公钥文件
[root@liumiaocn rsa]# openssl rsa -in rsa_key.private -pubout -out rsa_key.public writing RSA key [root@liumiaocn rsa]# ls -l total 12 -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 [root@liumiaocn rsa]# cat rsa_key.public -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLso6AoGmKuhoBAsDuTkWwIiHn qCoruH/SPLEgzw6+a+2YDw9lOqB1RVvhR9iWAxwA0TxVF96DxVk1mxEA7gYpCkV4 dOkxT483UIW7sLm/0ViQqMrYMWTnIIG+xtcNSwbBUZEOxZb0+f/91xriM40duPxW ACuQgwdU5WGeE145RwIDAQAB -----END PUBLIC KEY----- [root@liumiaocn rsa]#使用公钥对文件进行加密
使用openssl rsautl可以指定加密算法对文件进行加密,生成新的加密文件。
[root@liumiaocn rsa]# openssl rsautl -encrypt -in messages -out enc_messages -pubin -inkey rsa_key.public [root@liumiaocn rsa]# ls -lrt total 16 -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 [root@liumiaocn rsa]#
实际上新生成的文件已经是加密过的了,直接view可能看到的都是乱码。
使用私钥对文件进行解密文件解密通过-decrypt选项指定解密操作,同时可结合-out指定输出文件,执行示例如下所示:
[root@liumiaocn rsa]# openssl rsautl -decrypt -in enc_messages -out dec_messages -inkey rsa_key.private [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]#
此时再确认解密后的文件,已经是和原始文件的内容没有区别了
[root@liumiaocn rsa]# cat dec_messages Hello, this is greeting from liumiao [root@liumiaocn rsa]# diff dec_messages messages [root@liumiaocn rsa]#注意事项
使用rsautl加密/解密,可用的文件一般都是较小的Size,否则容易出现如下类似的错误提示信息:
[root@liumiaocn rsa]# openssl rsautl -encrypt -in messages.tar.gz -inkey rsa_key.private RSA operation error 139708920309568:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:crypto/rsa/rsa_pk1.c:125: [root@liumiaocn rsa]#总结
非对称加密算法,加密和解密使用不同钥匙,更好地保证了使用过程中的安全性,也有了更为广泛的适应性。