内容简介:#简介假设Alice需要向Bob借100万元,不过,Alice和Bob离得很远,无法直接见面。通过银行汇款,Alice可以立刻从Bob那里收到钱,但是Alice的借条应该怎样发送给Bob呢?可以用挂号寄过去,不过那样需要花上一段时间,能不能用电子邮件来发送借条呢?比如:“Bob,我向你借款100万元。-----Alice"
#简介
假设Alice需要向Bob借100万元,不过,Alice和Bob离得很远,无法直接见面。通过银行汇款,Alice可以立刻从Bob那里收到钱,但是Alice的借条应该怎样发送给Bob呢?可以用挂号寄过去,不过那样需要花上一段时间,能不能用电子邮件来发送借条呢?比如:
“Bob,我向你借款100万元。-----Alice"
显然,这样的邮件无法代替借条,Bob看到这封邮件也不会轻易相信,因为电子邮件是很容易被伪造的。Alice写的邮件可能被篡改,也有可能是有人伪装成Alice发送这封邮件,或者Alice也可以事后以”我不知道这张借条“为理由进行否认。
数字签名就是用来解决这样的问题,即识别篡改,伪装和防止否认。在数字签名总有两种行为:
- 生成消息签名行为
- 验证消息签名行为
生成消息签名是由消息的发送者Alice来完成的,也称为“对消息签名”,生成签名就是根据消息内容计算数字签名的值,这个行为意味着“我认可该消息的内容”。
验证签名这一行为是由消息的接收者Bob来完成的,但也可以由需要验证消息的第三方来完成,验证签名就是检查该消息的签名是否真的属于Alice,验证的结果可以是成功或者失败,成功以为着这个签名是属于Alice的,失败则意味着这个签名不是属于Alice的。
数字签名对签名密钥和验证密钥进行了区分,使用验证密钥是无法完成签名的,签名密钥只能由签名的人持有,而验证密钥则是任何需要验证签名的人都可以持有。实际上,数字签名和公钥密码有着非常紧密的联系,数字签名就是通过将公钥密码“反过来用”而实现的。
#公钥密码和数字签名
#数字签名实例
##直接对消息签名(DSA)
- Alice用自己的私钥对详细签名
用私钥加密得到的密文就是Alice对这条消息的签名,由于只有Alice才持有自己的私钥,因此除了Alice以外,其他人是无法生成相同的签名的。
- Alice将消息和签名发送给Bob
- Bob用Alice的公钥对收到的签名进行解密
如果收到的签名确实是用Alice的私钥进行加密得到的密文(签名),那么用Alice的公钥应该能正确的解密。如果接收到的签名不是用Alice的私钥进行加密得到的密文,那么就无法用Alice的公钥正确的解密
- Bob将签名解密后得到的消息与Alice直接发送的消息进行对比
如果两者一致,则签名验证成功,如果两者不一致,则签名验证失败。
##对消息散列值签名(RSA,椭圆加密)
上面我们使用直接对消息签名的办法,但这种方法需要对整个消息进行加密,非常耗时,这是因为公钥密码算法非常慢。所以我们可以求出消息的散列值再对散列值加密。无论消息有多长,散列值的长度是固定的,因此对散列值加密要快很多。
-
Alice用单向散列函数计算消息的散列值。
-
Alice用自己的私钥对散列值进行加密,用私钥加密散列值所得到的密文就是Alice对这条散列值的签名,由于只有Alice才持有自己的私钥,因此除了Alice意外,其他人是无法生成相同的签名的。
-
Alice将消息和签名发送给Bob
-
Bob用Alice的公钥对收到的签名进行解密。如果收到的签名确实是用Alice的私钥进行加密而得到的密文,那么用Alice的公钥应该能够正确解密,解密的结果应该等于消息的散列值。如果收到的签名不是用Alice的私钥经i选哪个加密而得到的密文,那么就无法用Alice的公钥正确解密。
-
Bob将签名解密后得到的散列值与Alice直接发送的消息的散列值进行对比。如果两者一致,则签名成功,否则签名失败。
学院 Go 语言视频主页
https://edu.csdn.net/lecturer/1928扫码获取海量视频及源码 QQ群:721929980
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。