非对称密钥算法的第二个用途就是实现数字签名,为什么要签名呢?签名的目的无非是对某一份文件进行确认。
????例如,欠条。张三欠李四 10000 元钱,欠款人张三在欠条上签名确认。签名的主要作用就是张三对这张欠条进行确认,事后不能抵赖(不可否认性)。到底最后谁会看这个签名呢?李四很明显没必要反复去确认签名。一般都是在出现纠纷后,例如,张三抵赖不还的时候,李四就可以把欠条拿出来,给法官这些有权威的第三方来进行验证,如果他们确认此欠条上的签名确实来自张三无疑,张三就不能再否认欠李四钱这一既定事实了。
????我们来看看数字签名是如何工作的。
步骤 1:重要明文信息通过散列函数计算得到散列值(明文)。
步骤 2:“用户一”(发起者)使用自己的私钥对步骤1计算的明文散列值进行加密,加密后的散列值就叫做数字签名(密文)。
步骤3:把重要明文信息和数字签名一起打包发送给“用户二”(接收方)。
步骤4:“用户二”从打包文件中提取出重要明文信息。
步骤5:“用户二”使用和“用户一”相同的散列函数对步骤4提取出来的重要明文信息计算散列值,得到的结果简称“散列值 1(明文)”。
步骤6:“用户二”从打包文件中提取出数字签名(密文)。
步骤7:“用户二”使用预先获取的“用户一”的公钥,对步骤6提取出的密文的数字签名进行解密,得到明文的“散列值 2”。
步骤8:比较“散列值 1”和“散列值2”是否相等。如果相等,数字签名校验成功。
1. 红红有两把钥匙,一把是公钥,另一把是私钥。
2. 红红把公钥送给他的朋友们——帕蒂、道格、苏珊——每人一把。
3. 苏珊要给红红写一封保密的信。她写完后用红红的公钥加密,就可以达到保密的效果。
4. 红红收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要红红的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
5. 红红给苏珊回信,决定采用“数字签名”。他写完后先用Hash函数,生成信件的散列值(digest)。
6. 然后,红红使用私钥,再对这个散列值(digest)加密,生成“数字签名”(signature)。
7. 红红将这个签名,附在信件下面,一起发给苏珊。
8. 苏珊收信后,取下“数字签名”(signature),用红红的公钥解密,得到信件的散列值1(digest 1)。由此证明,这封信确实是红红发出的。
9. 苏珊再对信件本身使用Hash函数,将得到的散列值2(digest 2),与上一步得到的散列值1(digest 1)进行对比。如果两者一致,就证明这封信未被修改过。
10. 复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了红红的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是红红的公钥。因此,道格就可以冒充红红,用自己的私钥做成“数字签名”,写信给苏珊,让苏珊用假的红红公钥进行解密。
11. 后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于红红。她想到了一个办法,要求红红去找“证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对红红的公钥和一些相关信息一起加密,生成“数字证书”(Digital Certificate)。
12. 红红拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
13. 苏珊收信后,用CA的公钥解开数字证书,就可以拿到红红真实的公钥了,然后就能证明“数字签名”是否真的是红红签的。
非对称密钥算法的主流协议:
RSA (数字签名和数字证书的主流协议)
DH (IPSec 产生密钥资源的主要协议)
ECC (椭圆曲线算法)
巧妙的加密解决方案
步骤1:“用户一”(发起方)使用本地随机数产生器,产生用于对称密钥算法的随机密钥,用于加密数据。
步骤2:使用步骤1产生的随机密钥,对重要的明文信息通过对称密算法进行加密,并得到密文。
步骤3:“用户一”(发送方)需要预先获取“用户二”(接收方)的公钥,并且使用“用户二”的公钥对步骤1产生的随机密钥进行加密,得到加密的密钥包。
步骤4:对步骤2和步骤3产生的密文和密钥包一起发送给“用户二(接收方)。
步骤5:“用户二”首先提取出密钥包,并且使用自己的私钥对它进行解密,并得到明文的随机密钥。
步骤6:“用户二”提取出密文,并且使用步骤5解密得到的随机密钥进行解密,得到明文的重要信息。