应用1:加密通信
|明文|->公钥加密->|密文|->私钥解密->|明文|
这种加密路径用于和他人进行加密通信,作用等同于对称加密。
我们回到Alice和Bob的例子来看下。
如果Bob想利用非对称加密算法私密的接收他人向他发送的信息,步骤是这样的。
1.首先Bob需要使用具体约定的算法(例如RSA)生成密钥和公钥,密钥自己保留,公钥对外公布。
2.Alice拿到Bob的公钥后,便可以对想要发送的消息“Alice已向Bob转账1BTC,请查收。”进行加密。
3.然后Alice将密文(例如是“FH39ggJ+shi3djifg35”)发送给Bob。
4.Bob收到消息后,用自己的私钥进行解密,还原出消息原文“Alice已向Bob转账1BTC,请查收。”
由于使用Bob公钥加密的消息只能用Bob的私钥解密(Bob的公钥也是不行的),而私钥只有Bob拥有,因此即使消息被第三方劫持,他也无法还原出消息明文。
应用2:数字签名
如果反过来,先用私钥加密呢?这便诞生了非对称加密的另一个重要应用:数字签名
我们回到Alice和Bob的例子来看下。
在比特币系统中,类似“Alice已向Bob转账1BTC,请查收。”这样的消息最终会被矿工记录在账本上,是与转账双方利益相关的。这样一条消息的受益方是Bob,我们腹黑一点想,如果Bob一直向网络中广播Alice给他转账的消息呢?
Bob:“Alice已向Bob转账1BTC”
Bob:“Alice已向Bob转账2BTC”
Bob:“Alice已向Bob转账3BTC”
…
因此,我们需要一种机制来证明Alice是“自愿”的,也就是消息是Alice亲自发出的。步骤是这样的:
1.Alice需要使用具体约定的算法(例如RSA)生成密钥和公钥,密钥自己保留,公钥对外公布。
2.当Alice想要发送消息 Alice已向Bob转账1BTC,请查收。| 我的公钥是:“gh3giPGFN2jgh3sF”。 时,Alice使用自己的私钥对消息进行加密,假设加密后的密文是 SHG356g3T4+dh4fh,现在这个密文可以看作Alice的数字签名。
3.Alice将消息明文和数字签名放到一起并发送到网络中
发送的消息类似这样的形式 Alice已向Bob转账1BTC,请查收。| 我的公钥是:“gh3giPGFN2jgh3sF”。| 签名:“SHG356g3T4+dh4fh”
4.网络中的所有人接收到消息后,都可以进行如下操作完成验证:
收到消息 Alice已向Bob转账1BTC,请查收。| 我的公钥是:“gh3giPGFN2jgh3sF”。| 签名:“SHG356g3T4+dh4fh”
使用Alice在消息中提供的公钥 gh3giPGFN2jgh3sF对私钥签署的数字签名SHG356g3T4+dh4fh进行解密
将解密结果与消息明文 Alice已向Bob转账1BTC,请查收。| 我的公钥是:“gh3giPGFN2jgh3sF”进行对比
如果一致,说明消息是Alice亲自发送的,因为只有Alice本人拥有Alice的密钥
如果不一致,则说明消息不是Alice发送的,或者虽然消息是Alice发送的但已遭到他人篡改
5.于是,通过4中描述的方法,Bob确认了Alice给他了一笔价值1BTC的转账。
网络中其他人(矿工)均成功验证了这条消息的真实性,并为Bob作证他的账户新增了1个BTC,Alice的账户减少了1个BTC。