密码技术-数字签名

时间:2024-03-29 15:16:54

一、数字签名

用私钥生成数字签名,用公钥验证签名

数字签名的方法
① 直接对消息签名(很少用这个)
(1)Alice 用自己的私钥对消息进行加密
(2)Alice 将消息和前面发送给 Bob
(3)Bob 用 Alice 的公钥对收到的签名进行解密
(4)Bob 将签名解密后得到的消息与 Alice 直接发送的消息进行对比
对比一致,签名验证成功,不一致,签名验证失败
② 对消息的散列值签名(通常用这个)
为什么实际中不直接对消息本身进行数字签名呢?这是因为公钥密码算法本来就非常慢,还要对消息全文进行加解密,因此如果能够有一个很短的数据替代消息本身是再好不过的了,而单项散列函数就很适合
(1)Alice 用单项散列函数计算消息的散列值
(2)Alice 用自己的私钥对散列值进行加密
(3)Alice 将消息和前面发送给 Bob
(4)Bob 用 Alice 对收到的签名进行解密
(5)Bob 将签名解密后得到的散列值与 Alice 直接发送的消息的散列值进行对比
密码技术-数字签名

二、对数字签名的疑问

1.密文为什么能够作为签名使用,意义在哪
数字签名的操作是使用私钥对消息进行加密,但这里的加密并非是为了保密,而是用于生成一种只有持有该**的人才能够生成的信息(即私钥本身是保密的,那么私钥加密生成信息自然保证了唯一性)
2.能否同时修改消息和签名,使得验证前面能够成功
这是做不到的,不管是直接对消息签名的方式还是对消息的散列值签名的方式,对发送的消息进行修改后,在不知道**的情况下需要对修改后的消息进行修改,使得签名可以被验签,而这是不可能的
3.签名不能否认,那如何使之作废
重新创建一份文书,让对方在文书上加上数字签名,或者一开始就在消息中写明有效期,然后再进行数字签名
4.如何防止否认
防止否认和谁持有**密切相关,就是说能够生成签名的**只有**持有者持有,因此谁持有**就是谁的签名,因此无法否认

三、数字签名的应用

1.网站公告
网站消息目的是让更多人看到,所以不需要加密,但是需要保证消息不被篡改,对明文消息进行数字签名,利用了数字签名完成对消息的认证
2.软件下载
数字签名只能保证软件是否被篡改,无法判断软件本身是否是恶意软件
3.公钥证书
为了保证公钥的合法性,不是伪造的(防止中间人攻击),一般需要权威的第三方对公钥进行数字签名,签名后得到的就是公钥证书,使用权威的第三方的公钥对签名进行数字验签就能确定公钥的合法性
那么问题来了,权威的第三方的公钥就一定是真的?如果被纂改了怎么办?只要存在**发送,那么一定存在被纂改的可能,一级一级向上进行的验签,到顶的话就是操作系统预装的根证书

四、对数字签名的攻击

1.中间人攻击
通过伪装身份,对发送者伪装成接收者,对接收者伪装成发送者,就可以在不知道签名**的前提下完成攻击,可以使用公钥证书对公钥进行认证
2.单项散列函数攻击
单项散列函数有一个输入和一个输出,输入称为消息,输出称为散列值,根据消息的内容可以计算出散列值,不同的消息对应不同的散列值,因此可以用散列值检查消息的完整性(也称一致性)
单项散列函数也称消息摘要函数、哈希函数,任意长度的消息计算得到的散列值的长度都是固定的,如 SHA-256 单项散列函数计算出的散列值的长度永远是 32 字节,且是不可逆的(不能由输出得到输入)
数字签名中使用的单项散列函数单向散列函数必须具有抗碰撞性(碰撞率低),如果不同的输入有相同的输出(碰撞率高),那么就不适合用来检查消息的完整性(也称一致性)