RSA加解密、签名验签過程
RSA加密是一种非对称加密,通常使用公钥加密,私钥解密,私钥签名,公钥验签。私钥是個人保存,公钥是公开的。
所以,加密解密是指公钥加密私钥解密,签名验签是指私钥签名(其实也是加密)公钥验签(其实也是解密)。
RSA加密与签名的区别
加密是为了防止信息被泄露,签名是为了信息被篡改。
假设A、B需要通过RSA加密通信,A拥有私钥,B拥有公钥
RSA加密解密過程(B向A发送信息的场景):
a. A生成一對密钥(公钥和私钥),私钥A自己保留,公钥发送给B
b. B用公钥加密需要发送给A的消息
c. A接收到B发送的加密消息,用自己的私钥解密出原消息
在这個過程中,衹有2次传递過程,第一次是A传递公钥给B,第二次是B传递加密消息给A,即使都被拦截也没有危险性,因为衹有A的私钥才能對加密消息进行解密,防止了消息内容泄露。RSA签名验签過程(A向B回复消息)
a. A生成一對密钥(公钥和私钥),私钥A自己保留,公钥发送给B
b. A利用自己的私钥對消息加签,形成签名,并将加签的消息和消息本身一起发送给B
c. B收到消息後,使用公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的
在这個過程中,衹有2次传递過程,第一次是A传递公钥给B,第二次是A传递加签消息和消息本身给B,即使都被拦截也没有危险性,因为衹有A的私钥才能對消息进行签名,即使知道了消息内容,也無法伪造带签名的消息回复给B,防止了消息内容的篡改。
openssl 命令使用
• 对称加密相关
- base64编码
echo string | openssl enc -base64
echo string | openssl base64
使用-out指定输出文件,否则输出到控制台
openssl enc -base64 -in input_file
openssl base64 -in input_file
• 使用openssl生成密钥、签名证书
生成RSA密钥
a. 生成私钥文件
openssl genrsa -out pem_file(密钥文件) bit_count(位数,如1024)
b. 查看RSA私钥参数
openssl rsa -in pem_file(私钥文件) -text -noout
c. 根据RSA私钥文件生成公钥文件
openssl rsa -in private_pem_file(私钥文件) -pubout -out public_pem_file(公钥文件)
加密密钥文件(使用DES、DES3算法)
openssl rsa -in pem_file(密钥文件) -des3 -out encrypt_pem_file(加密的密钥文件)
加解密,实际上是用公钥部分加密私钥解密
openssl rsautl -encrypt -in plain_file -inkey pem_file -out out_file
openssl rsautl -decrypt -in encrypt_file -inkey pem_file -out out_file
如果指定为公钥文件,补上 -pubin 选项
签名与验签,实际上是使用私钥加密,公钥解密
openssl rsautl -sign -in plain_file -inkey pem_file -out out_file
openssl rsautl -veriry -in signed_file -inkey pem_file -out out_file
如果指定为公钥文件,补上 -pubin 选项转换密钥格式
a. pem格式转成der格式,使用-outform指定der格式
openssl rsa -in pem_file -outform der -out der_file
b. der格式转成pem格式,使用-outform指定pem格式
openssl rsa -in der_file -inform der <-outform pem> -out pem_file
openssl摘要和签名验证
- 信息摘要和数字签名概述
信息摘要 是 對数据进行处理得到一段固定长度的结果,其有如下特点:
a. 输出长度固定,即输出长度与输入长度無关
b. 不可逆,即由输出数据理论上不能找推导出输入数据
c. 對输入数据敏感,当输入数据变化极小時,输出数据也會发生明显的变化
d. 防碰撞,即不同的输入数据得到相同的输出数据的可能性极低
由于信息摘要有上述特点,一般保证数据的完整性,对一個大文件進行摘要运算,得到其摘要值。通过网络或其它渠传输後通過验证其摘要值,确定大文件本身有没有发生变化。
数字签名 是 分成两步,首先對原始文件進行摘要运算,得到摘要值,然後使用私钥對摘要值进行加密。
openssl 做摘要计算
openssl dgst -sha1(或者使用其它摘要算法) in_file
openssl 使用RSA密钥進行签名验证操作
a. 签名
openssl dgst -sign rsa_private_pem_file -sha256(或者使用其它摘要算法) -out out_file in_file
b. 使用私钥验签
openssl dgst -prverify rsa_private_pem_file -sha256(或者使用其它摘要算法) -signature signed_file(签名文件) in_file(原始文件)
c. 使用公钥验签
openssl dgst -verify rsa_public_pem_file -sha256(或者使用其它摘要算法) -signature signed_file(签名文件) in_file(原始文件)