关于加密程序员应该了解的那点事(2) - 数字签名

Posted by 云谷计算 on March 10, 2018

数字签名

假如你是李刚,那么该如何向别人证明你是李刚?现实中当遇到这样的问题,我们可能会拿出身份证,驾驶本等证件;也可能会通过接受预留手机的验证码;也可能会回答一些预设置的问题(小学4年纪的同桌,女朋友的生日等等…)。

数字签名其实就是要解决在计算机和网络世界,如何向别人证明一段数字信息是李刚发布的,这里就需要利用非对称加密的特点了:

第一步:李刚生成一对密钥对,将需要发送的信息经过HASH处理后生成对应的摘要(DIGEST1), 再把摘要用私钥加密,原文+加密摘要+公钥一起发送给其它人。

第二步:其它人接受到这些信息后,首先将加密摘要用公钥解密得到DIGEST1, 再用同样的HASH处理原文得到DIGEST2, 如果DIGEST1等于DIGEST2, 那么就可以肯定这段信息肯定来自于李刚。

OpenSSL实现

还是用ssh-keygen生产mykey密钥对,私钥是mykey,公钥是mykey.pub。

$ ssh-keygen -f ~/mykey
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/mykey.
Your public key has been saved in /root/mykey.pub.
The key fingerprint is:
SHA256:tTInYoRAlxD5K6xQpfud6atKRPm8bcUeKWTK+V/6pOA root@ecs-blog2.novalocal
The key's randomart image is:
+---[RSA 2048]----+
| .=+..           |
|  .+o.           |
|  o+. +   .      |
| .o+.* . o .     |
| o..*.+ S o      |
|..+ .= = *       |
|...o..=o. o      |
|..  .o+o =       |
|  ...oE.+..      |
+----[SHA256]-----+

发送方生成签名, 将data.txt, mykey.pub, sigature.bin发送给接受方:

# 计算数据消息摘要:
openssl dgst -sha1 -out digest.txt data.txt

# 用发送方的的私钥给消息摘要签名:
openssl rsautl -sign -inkey mykey -in md.txt -out signature.bin

接受方验证签名:

# 计算数据消息的摘要,获得digest1
openssl dgst -sha1 -out digest1.txt data.txt

# 用公钥解密sigature.bin, 获得digest2
opensll rsautl -verify -pubin -inkey mykey.pub -in signature.bin -out digest2.txt

如果digest1 == digest2,那么就证明data.txt是来自发送方了。