前言
本文章是对《图解密码技术》一书第二部分的一个总结。
认证
本文章将介绍如何确认消息完整性(单向散列函数)、进行认证(消息认证码)已经防止否认(数字签名)。
单向散列函数
单向散列函数,也称消息摘要函数、哈希函数或者杂凑函数,根据消息的内容计算出消息的散列值,通过散列值可以用来检查消息的完整性。
性质
单向散列函数有如下性质:
- 根据任意长度的消息计算出固定长度的散列值
- 能够快速计算出散列值
- 消息不同散列值也不同
- 具备单向性,即无法通过散列值反算出消息
应用
单向散列函数有如下应用:
- 检查软件是否被篡改
- 基于口令的加密
- 消息认证码
- 数字签名
- 伪随机数生成器
- 一次性口令
散列函数
常用的单向散列函数有:
- MD4、MD5,目前这个两个算法的强抗碰撞性已经被破解,已经能够产生具备相同散列值的两条不同的消息。
- SHA-1、SHA-2(SHA-256、SHA-384、SHA-512等), SHA的强抗碰撞性已经被攻破,SHA-2还尚未被攻破。
- RIPEMD、RIPEMD-160, RIPEMD已经被攻破,RIPEMD-160尚未被攻破,比特币使用的是RIPEMD-160。
- SHA-3,Keccak算法于2012年被选为SHA-3。
消息认证码
消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,简称MAC。
使用
其使用步骤如下图:
- 发送者Alice与接收者Bob事先共享密钥;
- 发送者Alice根据汇款请求消息计算MAC值(使用共享密钥);
- 发送者Alice将汇款请求和MAC值两者发送给接收者Bob;
- 接收者Bob根据接收到的汇款请求消息计算MAC值(使用共享密钥);
- 接收者Bob将自己计算得MAC值和从Alice处收到的MAC值进行对比;
- 如果两个MAC值一致,则接收者Bob就可以断定汇款请求的确来找Alice(认证成功),如果不一致,则可以断定消息不是来找Alice(认证失败)。
数字签名
数字签名就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明,可以用来识别篡改和伪装,还可以防止否认。数字签名是非对称密钥加密技术与数字摘要技术的应用。
签名生成和验证
数字签名中,包括生成消息签名和验证消息签名两部分。
消息发送者使用签名密钥来生成消息的签名,而消息接收者或者验证者则使用验证密钥来验证消息的签名。签名密钥只能由签名的人持有,而验证密钥的则是任意需要验证签名的人都可以持有。
实际上,数字签名跟公钥密码有非常紧密的联系,两者非常相似。简而言之,数字签名就是通过将公钥密码“反过来用”而实现的。
数字签名方法
有两种生成数字签的方法:
- 直接对消息签名的方法
- 对消息的散列值签名的方法
直接对消息签名的方法
签名和验证流程如下图:
对消息的散列值签名的方法
签名和验证流程如下图:
应用
数字签名有如下一些应用:
- 安全信息公告
- 软件下载
- 公钥证书
- SSL/TLS
RSA实现数字签名
RSA生成签名:
签名 = 消息^D mod N
RSA验证签名:
由签名求得的消息 = 签名^E mod N
验证签名时,将“由签名求得的消息”与“消息”进行对比。
参考
- 《图解密码技术》[日] 结城浩 著