一 点睛
直接对消息签名的方法是对整个消息的加密,非常耗时,这是因为公钥密码算法本来就非常慢。那么,能不能生成一种很短的数据来代替消息本身呢?当然有,那就是单向散列函数。
我们可以不必对整个消息进行加密(即对消息签名),而是先用单向散列函数求出消息的散列值,然后在将散列值进行加密(对散列值签名)就可以了。无论消息有多长,散列值永远都是这么短,因此对其进行加密(签名)就非常轻松了。
二 签名和验证过程
1 Alice用单向散列函数计算消息的散列值。
2 Alice用自己的私钥对散列值进行加密。
用私钥加密散列值所得到的密文就是Alice对这条散列值的签名,由于只有Alice才持有自己的私钥,因此除了Alice外,其他人是无法生成相同的签名(密文)的。
3 Alice将消息和签名发送给Bob。
4 Bob用Alice的公钥对收到的签名进行解密。
如果收到的签名确实是用Alice的私钥进行加密而得到的密文(签名),那么Alice的公钥应该能够正确解密,解密的结果应该等于消息的散列值。如果收到的签名不是用Alice私钥进行加密而得到的密文,那么就无法用Alice的公钥正确解密(解密后得到是随机的)。
5 Bob将签名解密后得到的散列值与Alice直接发送的消息的散列值进行对比。
如果两者一致,则签名验证成功;如果不一致,则签名验证失败。
三 过程图
四 时序图