密码学基础(四):OpenSSL命令详解

openssl介绍

密码学标准和我们平常所见的互联网协议一样,是一种大家都遵守的约定和标准,比如PKCS#1中规定了 RSA 秘钥时怎么生成的,公私钥的格式等内容,x509标准规定了证书的格式等。

OpenSSL 本质就是一个工具集,按照主流的密码学标准实现了常用的加密算法,证书的生成、签名、验签等功能。

因为网络上的资料比较杂,有的是一些比较老的版本,有的又不完整,所以自己稍加总结,方便以后重新查阅。而学习 OpenSSL 的目的只是为了加深对密码学基础内容的理解和一些知识点的验证,不是密码学的开发人员暂时不需要去研究 OpenSSL 源码,有这功夫还不如多补补算法、C/C++、编译原理、数据结构等底层知识,所以本文只会建立 OpenSSL 大概的使用框架以及主流功能,完整的功能及其溯源不再本文讨论范围。

本文将分三类讲述 OpenSSL 指令的使用,其中也只讲解常用的指令:dgst、enc、rsa指令集合、req、x509、pkcs12。CA 指令因为在平时较少使用,暂不研究。

非对称加密

OpenSSL 一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA 算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名, 这里主要演示 RSA 算法,需要使用DH算法的可以自行研究 pkey 指令集合。

genrsa指令

genrsa指令虽然已经被功能更加全面的genpkey指令取代,但是因为其相对简单,功能纯粹,可以作为学习genpkey的基础。另外,genpkey 中的一些更详细的功能在现阶段使用不到,使用genrsa直接生成私钥相对简单方便,容易掌握。其可选参数如下:

usage: genrsa [args] [numbits]
-out file       output the key to 'file'(输出的文件名)
-passout arg    output file pass phrase source(给输出的文件设置密码,此处不同于对称算法加密,对称算法是对私钥结果进行加密,这里是对文件加密)
-f4             use F4 (0x10001) for the E value(使用65537作为E的值,E在RSA算法中使用场景为:1<e<φ(n) ,默认)
-3              use 3 for the E value(使用3作为E的值,非默认)

// 以下为对称加密选项
-des            encrypt the generated key with DES in cbc mode
-des3           encrypt the generated key with DES in ede cbc mode (168 bit key)
-aes128, -aes192, -aes256
                 encrypt PEM output with cbc aes
-camellia128, -camellia192, -camellia256
                 encrypt PEM output with cbc camellia

genrsa接两个参数,第一个选项参数,第二个为rsa算法中的m值的长度,一般为1024,更高安全级别的位2048。其中,如果不设置对称加密的算法,则不会对私钥结果进行加密,如果不为空,则会要求输入对称算法中将要使用的秘钥,使用如下:

1、生成私钥
openssl genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
..............++++++
...............................++++++
e is 65537 (0x10001)

得到的结果为:

4044896-89c82798b97a322a.png
私钥

2、生成私钥并使用对称算法对秘钥进行加密
openssl genrsa -aes128 -out private.pem 1024
Generating RSA private key, 1024 bit long modulus
....................................................++++++
.................++++++
e is 65537 (0x10001)
Enter pass phrase for private.pem:123456
Verifying - Enter pass phrase for private.pem:123456

结果:

4044896-f73ca2d4df2c804e.png
ase加密之后的私钥

rsa指令

rsa功能比较多,可以对秘钥进行管理。其中最主要的功能就是从私钥中提取公钥、查看秘钥的结构信息,可以使用-help查看:

usage: rsa [options]

 -check             检测秘钥合法性
 -in file           输入的文件名
 -inform format    输入文件的格式 (DER, NET or PEM (default))
 -modulus           打印 RSA 秘钥的modulus
 -out file          输出的文件名
 -outform format    输出文件的格式(DER, NET or PEM (default PEM))
 -passin src        输入文件的密码
 -passout src       输出文件的密码
 -pubin             该指令说明输入的是公钥,默认为私钥
 -pubout            该指令说明需要输出公钥,默认输出私钥
 -sgckey            what it is?
 -text              打印信息

其中,ciphername可选值有-AES-192-CBC等等,可以通过-help指令查看,此处不再列出。主要功能演示如下:

1、查看秘钥信息
openssl rsa -in private.pem -text

结果:

4044896-d8a6d4c689d2af71.png
查看秘钥信息

2、从私钥中提取公钥
openssl rsa -in private.pem -pubout -out public.pem
3、给秘钥添加/去除/修改对称加密的密码
// 为RSA密钥增加口令保护
openssl rsa -in RSA.pem -des3 -passout pass:123456 -out E_RSA.pem

// 为RSA密钥去除口令保护
openssl rsa -in E_RSA.pem -passin pass:123456 -out P_RSA.pem

// 修改加密算法为aes128,口令是123456
openssl rsa -in RSA.pem -passin pass:123456 -aes128 -passout pass:123456 -out E_RSA.pem
4、转换秘钥格式
// 把pem格式转化成der格式,使用outform指定der格式
openssl rsa -in RSA.pem -passin pass:123456 -des -passout pass:123456 -outform der -out rsa.der
rsautl指令

以上两个指令时生成和管理秘钥,而rsautl指令则和秘钥的具体使用有关,也就是如何使用 rsa 秘钥进行加密解密操作。

Usage: rsautl [options]
// 输入文件(被加密/解密/签名)和输出文件
-in file        被操作的文件
-out file       操作完成后的输出文件

// 输入的秘钥
-inkey file     完成操作时使用到的秘钥

// 集中填充方式
-ssl            use SSL v2 padding
-raw            use 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值