本文属于《OpenSSL加密算法库使用系列教程》之一,欢迎查看其它文章。
我们知道常用的加密算法分为对称、非对称、摘要这三种。
那么在OpenSSL中也有对应的命令。
一、对称加密命令
对称加密需要使用的标准命令为enc,可使用如下命令查看使用帮助:
openssl enc -help
常用选项有:
-e:表示加密,可以指明一种加密算法,若不指的话将使用默认加密算法
-d:表示解密,也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致
-in filename:指定要加密的文件存放路径
-out filename:指定加密后的文件存放路径
-salt:自动插入一个随机数作为文件内容加密,默认选项
-a/-base64:使用-base64位编码格式
-K:指定秘钥,16进制格式
-iv:指定初始化向量,16进制格式
-list:列出当前支持的加密算法列表(openssl enc -list)
举例:
使用aes-128-ecb算法对hello.txt加密,128位密钥为8cc72b05705d5c46f412af8cbed55aad,密文为hello.en。
openssl enc -e -aes-128-ecb -in hello.txt -out hello.en -K 8cc72b05705d5c46f412af8cbed55aad
使用aes-128-ecb算法对hello.en解密,128位密钥为8cc72b05705d5c46f412af8cbed55aad,解密后为hello.de。
openssl enc -d -aes-128-ecb -in hello.en -out hello.de -K 8cc72b05705d5c46f412af8cbed55aad
明文hello.txt与解密后的hello.de相等。如果秘钥不一致,解密后与明文不相等。
openssl enc命令仅适用于OpenSSL中对称加密算法,如AES、DES、Triple-DES。
二、非对称加密命令
主要是指RSA算法等相关命令,包括生成秘钥、加密、数字签名等。
1、生成秘钥
使用openssl genrsa标准命令。
查看帮助:
openssl genrsa -help
生成私钥文件private.pem:
openssl genrsa -out private.pem
这里-out指定生成文件。
根据私钥private.pem提取出公钥public.pem:
openssl rsa -in private.pem -out public.pem -pubout
-in指定输入文件,-out指定提取生成公钥的文件名。至此,我们手上就有了一个公钥,一个私钥。现在可以将用公钥来加密文件了。
2、加密文件
使用openssl rsautl标准命令。
查看帮助:
openssl rsautl -help
我在目录中创建一个hello的文本文件,然后利用之前的公钥进行加密,私钥进行解密。
加密文件:
openssl rsautl -encrypt -in hello.txt -inkey public.pem -pubin -out hello.en
-in指定要加密的文件,-inkey指定密钥,-pubin表明是用纯公钥文件加密,-out为加密后的文件。
解密文件:
openssl rsautl -decrypt -in hello.en -inkey private.pem -out hello.de
-in指定被加密的文件,-inkey指定私钥文件,-out为解密后的文件。
至此,一次加密解密的过程告终。
3、数字签名
数字签名分为摘要和加密两部分,但是在openssl提供的指令中,并没有区分两者。需要注意的是,签名是指对明文的摘要进行加密,得到的密文就称为签名,而非对明文数据进行加密。
使用openssl dgst标准命令。
查看帮助:
openssl dgst -help
使用dgst命令,然后利用之前的私钥进行签名,公钥进行验签。
签名:
openssl dgst -sha1 -sign private.pem -out sign.txt hello.txt
指定sha1算法对hello.txt计算文件摘要,并用私钥对摘要签名,生成签名文件sign.txt
验签:
openssl dgst -verify public.pem -sha1 -signature sign.txt hello.txt
指定sha1算法对hello.txt计算文件摘要,并用公钥对签名文件,进行验签。这里是使用RSA公钥验证签名(verify参数),验证成功。
另外:
大家都知道可以从私钥文件中提取公钥文件,所以验签时,也可以直接用私钥文件来验签。
使用RSA密钥验证签名(prverify参数),验证成功
openssl dgst -prverify private.pem -sha1 -signature sign.txt hello.txt
疑问: 为什么可以从私钥导出公钥,而不能从公钥导出私钥?
从公钥导出私钥,实际上等同于RSA被破解,理论上,RSA可以被破解,但是随着key越长,其破解难度越大。
目前被破解的最长RSA密钥就是768位,因此就常见的RSA 1024位及以上,基本上是不能被破解的。也就是说公钥导出私钥是不成立的。
所以,OpenSSL中可以由私钥导出公钥,猜测应该是私钥的容器往往同时包含私钥与公钥(公钥是让所有人都会知道,那么拥有私钥的人没有道理不留存一份公钥),而公钥的容器仅包含公钥。
三、哈希命令
使用openssl dgst标准命令。
计算hello.txt文件的md5值:
openssl dgst -md5 hello.txt
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。