简介
数字签名就是用来解决篡改,伪装,和否认的问题。在数字签名中存在量中行为:
-
生成消息签名
-
验证消息签名
生成消息是由消息的发送者完成的,也称之为“对消息签名”,生成签名就是根据消息内容计算数字签名的值,这个行为意味这认可这个消息。
|
私钥 |
公钥 |
公钥密码 |
消息接收者解密时使用 |
消息发送者加密时使用 |
数字签名 |
签名这生成签名时使用 |
验证者验证签名时使用 |
谁持有**? |
个人持有 |
只要需要,任何人都可以持有 |
公钥密码和数字签名
- 用公钥进行加密(公钥密码):
- 用私钥进行加密(数字签名):
数字签名的实例
-
直接对消息签名(DSA)
a.Alice用自己的私钥对消息签名
用私钥得到的密文就时Alice对这条消息的签名,由于只有Alice才持有自己的私钥,因此除了Alice意外,其他人无法生成相同的签名。
b.Alice 将消息和签名发送给Bob
c.Bob用Alice的公钥对收到的签名进行解密
如果收到的签名确实使用Alice的私钥进行加密得到的,那么用Alice的公钥应该能正确解密。如果接收到的签名不是用Alice的私钥进行加密得到的密文,那么就无法用Alice的公钥正确的解密
d.Bob将签名后得到的消息与Alice直接发送的消息进行对比。
e.如果两者一致,则签名验证成功,如果两者不一致,则验证失败。
-
对消息散列值签名(RSA,椭圆加密)
上面我们使用直接对消息签名的颁发,但这种方法需要对整个消息进行极爱,非常耗时,这是因为公钥密码算法效率不高,所以我们可以求出消息的散列值然后对散列值加密。无论消息有多长,散列值是固定的,因此对散列值签名快很多。
(1).Alice用单向散列函数计算消息的散列值
(2).Alice用自己的私钥对散列值进行加密
用私钥加密散列值所得到的密文就是Alice对这条散列值的签名,由于只有Alice才持有自己的私钥,因此除了Alice以外,其他人无法生成相同的签名。
(3).Alice将消息和签名发送给Bob
(4).Bob用Alice的公钥对收到的签名进行解密
如果收到的签名确实使用Alice的私钥进行加密的而得到的密文,那么用Alice的公钥ing该可以正确解密,解密的结果应该等于消息的散列值。如果收到的签名不是用Alice的私钥进行加密而得到的密文,那么无法用Alice的公钥正确解密。
(5).Bob将签名解密后得到的散列值与Alice发送的消息散列值进行对比。
如果两者一致,则签名成功,否则签名失败。