RSA加密算法四:openssl中RSA算法使用
RSA使用广泛,最常见的有在openssl中直接生成RSA证书
1、使用openssl生成私钥文件
生成1024位长度RSA私钥证书
命令:openssl genrsa -out test.key 1024
使用cat命令查看证书内容
命令:cat test.key
使用命令查看证书各属性
命令:openssl rsa -text -in test.key
注:如果仔细查看会发现生成的两个素数q和p,表示出来位数多了个0x00,查看下bit数发现多了,这是怎么回事呢?
以128bit证书验证下
证书中的n,p,q都表示为0x00开头数
简单的计算一下 n 的值 看是否是 n = p*q
计算得到的值与证书中的n值相同,说明证书属性表示中的0x00只是填充位,不占长度,数据是从左到右读的
openssl中生成的证书没有具体的格式要求,可以自定义文件后缀甚至没有后缀
只不过测试发现,linux不识别的系统文件会稍大一些
以生成的32位长度证书为例,查看证书中每一项代表那些属性
这就是私钥文件的全部内容,包含的主要属性为:
Private-key: 32bit 私钥长度
Modules: n 私钥长度就是n长度,f2:57:f2:57一共4*8=32bit
publicExponent: e 公钥e
privateExponent: d 私钥d
Prime1: 素数p
Prime2: 素数q
Exponent1: d mod (p – 1)
Exponent1: d mod (q – 1)
Coefficient: CRT系数 (q ^-1)mod p 即(q**-1) mod p //分数取模
前边几项比较好理解和证明,标红的部分需要计算下进行验证
(注:因为分数取模不太好算,这里把结果带入倒推回去,证明q*co%p == 1)
总结一下,每一项属性代表的含义为:
2、使用openssl生成公钥文件
以上是使用openssl生成的私钥文件,下面使用命令生成对应的公钥文件
因为公私钥使用的是相同的 n = p*q 值,或者说生成的是相同的p和q
所以公钥文件生成算是在私钥文件的基础上
命令:openssl rsa -in test.key -pubout -out test_pub.key //使用私钥作为输入计算得到公钥做输出
使用cat命令查看公钥证书内容
公钥证书内容就比较简单了,以32位公钥证书为例,使用openssl命令查看公钥证书属性内容
其中各项意义:
Public-key: 32bit 公钥长度
Modules: n 素数pq的乘积,n的长度就是公钥长度
Exponent: e 公钥e
3、使用openssl公私钥文件对数据进行加解密
首先创建一个文件,写入要加密的明文m
然后使用公钥文件对文件进行加密
命令:openssl rsautl -encrypt -in hello -inkey test_pub.key -pubin -out hello.en
使用cat命令查看加密后的文件时显示的是乱码
使用私钥文件对加密后的文件进行解密
命令:openssl rsautl -decrypt -in hello.en -inkey test.key -out hello.de
解密后文件恢复以前大小,查看解密后的文件内容也是没有问题
加解密过程中用到的所有文件为:
hello: 明文,待加密的文件
hello.de: 解密后的文件
hello.en: 加密后的文件
test.key: 私钥,用于解密
test_pub.key: 公钥,用于加密