二、认证
0x07 单向散列函数—完整性
用于确保数据的完整性
性质:任意长度输入计算固定长度输出(256bit(32byte))、快速计算、弱抗碰撞性(找和该条消息具有相同散列值的另外一条消息是非常困难)、强抗碰撞性(散列值任意,找散列值相同的两条不同信息非常困难)、单向性、
应用:检测软件是否被篡改;基于口令的加密(passsword based encryption,将口令和盐混合后计算其散列值);消息认证码;数字签名;伪随机数生成器;一次性口令;
MD结构:
MD4:Rivest设计,产生128bit的散列值(RFC1186)
MD5:Rivest设计,产生128bit的散列值(RFC1321),强抗碰撞性已被攻破
SHA-1:NIST设计,产生160bit的散列值,强抗碰撞性2005年已被攻破,输入上限为2的64次方-1bit
SHA-2:输入上限为2的128次方-1bit
SHA-256/384/512:NIST设计,产生256/384/512bit的散列值,
RIPEMD-160:1996年由Hans Dobbertin、Antoon Bosselaers和Bart Preneel设计,产生160bit的散列值,
SHA-3:公开选拔,Keccak算法被选中(采用了与SHA-2完全不同的结构;结构清晰,易于分析;能够适用于各种设备,也适用于嵌入式应用;在硬件上的实现显示出了很高的性能;比其他最终候选算法安全性边际更大);可以生成任意长度的散列值;
Keccak海绵结构:
- 吸收阶段(absoring phase)
- 输入进行每r bit分组,不足填充
- 内部状态b(r+c)bit为0,前r bit与输入分组1进行XOR,结果作为函数f输入值,c直接往后一直继承;
- 将函数f输入值与输入分组2进行XOR,一直循环;
- 处理完所有分组后,结束;r的内容全靠输入,称为比特率bit rate,影响输出,c不受内容分组直接影响,被称为容量capacity,防止泄露
- 挤出阶段(squeezing phase)
- 将函数f的输出值的r bit保存为输出分组1,并将输出值(r+c)再次输入到函数f中;
- 将函数f的输出值的r bit保存为输出分组2,并将输出值(r+c)再次输入到函数f中;
- 重复执行,直到获得想要的长度;
- 双工结构:输入与输出一起进行,用于伪随机数生成器、流密码、认证加密、消息认证码
- 内部状态:三维比特数组
对散列函数的攻击:
- 暴力破解:已知散列值,找另一个散列值相同的消息,对弱抗碰撞性进行攻击,攻击次数可通过散列值长度计算(原像攻击Pre-Image Attack),已知消息,找另一个散列值相同的消息(第二原像攻击Second Pre-Image Attack)
- 生日攻击:找散列值相同的任意两条消息,对强抗碰撞性进行攻击
国密|SM3:GM/T 0004-2012 。安全性及效率与SHA-256相当,主要用于数字签名及验证、消息认证码生成及验证、随机数生成等,可满足多种密码应用的安全需求,算法已公开。
SM3对长度为小于264 比特的消息m, SM3杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为256比特,分组长度512。
- 消息填充:512*K+448
- 迭代压缩:消息扩展->压缩函数->杂凑值
无法解决消息是谁发出,即认证问题
0x08 消息认证码—完整性与认证双方
MAC(Message Authentication Code)用于确认完整性并认证的技术,输入任意长度消息和共享密钥,输出固定长度数据MAC值。要计算MAC值必须有共享密钥,没有就无法计算MAC值,通过此完成认证,加上对MAC值进行单向散列函数计算,可以确保完整性。
- 发送者Alice与接收者Bob事先共享密钥。
- 发送者Alice根据汇款请求消息计算MAC值(使用共享密钥)。
- 发送者Alice将汇款请求消息和MAC值两者发送给接收者Bob。
- 接收者Bob根据接收到的汇款请求消息计算MAC值(使用共享密钥)。
- 接收者Bob将自己计算的MAC值与从Alice处收到的MAC值进行对
- 如果两个MAC值一致,则接收者Bob就可以断定汇款请求的确来自Alice(认证成功);如果不一致,则可以断定消息不是来自Alice(认证失败)。
应用:SWIFT(Society for Worldwide Interbank Financial Telecommunication)银行之前通信使用,在公钥密码进行交换前进行消息认证,共享密钥使用人进行配送;IPsec;SSL/TLS;
实现方法:
- 单向散列函数SHA-2实现—HMAC;
- 分组密码密钥实现AES—CMAC;
- 流密码和公钥密码;
认证加密AE:将对称密码和消息认证码相结合,同时满足机密性,完整性,认证三大功能
Encrypt-then-MAC(用对称密码加密明文,再计算密文MAC值);
Encrypt-and-MAC(将明文用对称密码加密,并对明文计算MAC值);
MAC-then-Encrypt(先计算明文的MAC值,然后将明文和MAC值同时用对称密码加密);
GCM :Galois/Counter Mode,认证加密方式,使用AES的CTR模式,并使用一个反复进行加法和乘法运算的散列函数来计算MAC值,专门用于消息认证码的GCM称为GMAC
HMAC:用哈希作为消息认证码,hash(opadkey || hash(ipadkey || message)),密钥填充—填充后密钥与ipadXOR—与消息组合放前面计算散列—填充后密钥与opadXOR—与上面的散列组合放前面计算散列—得到MAC。
ipad为16进制的36不断重复到分组长度的比特序列,opad为16进制的5c不断重复到分组长度的比特序列。
消息认证攻击(防御):重放(序号,时间戳,随机数nonce);密钥推测攻击(不能让MAC值反推出密钥)
防否认问题无法解决,因为密钥是双方共享的。
0x09 数字签名—防止否认
私钥加密生成签名,公钥解密验证签名
通过单向散列函数计算消息的散列值,再对散列值进行私钥加密,发送公钥、签名和消息;接收者计算消息散列值并与公钥验签得到的值对比。
核心:特定的签名者与特定的消息绑定在一起。
应用:安全信息公告(不加密消息,只对消息进行数字签名);软件下载;公钥证书(对公钥签名);SSL/TLS
数字签名算法:ElGamal、DSA(即RSA的公私钥对换的签名版本)、ECDSA、Rabin
电子签章系统:
无法解决公钥是否属于真正发送者问题
0x10 证书—对第三方证明
公钥证书(Public-Key Certificate,PKC),认证机构(Certification Authority、CertifyingAuthority,CA)施加数字签名
- Bob生成密钥对
- Bob在认证机构Trent注册自己的公钥
- 认证机构Trent用自己的私钥对Bob的公钥施加数字签名并生成证书
- Alice得到带有认证机构Trent的数字签名的Bob的公钥(证书)
- Alice使用认证机构Trent的公钥验证数字签名,确认Bob的公钥的合法性
- Alice用Bob的公钥加密消息并发送给Bob
- Bob用自己的私钥解密密文得到Alice的消息
公钥基础设施(Public-Key Infrastructure)是为了能够更有效地运用公钥而制定的一系列规范和规格的总称。
- 用户
- 【注册公钥的用户所进行的操作】
生成密钥对(也可以由认证机构生成)
在认证机构注册公钥
向认证机构申请证书
根据需要申请作废已注册的公钥
解密接收到的密文
对消息进行数字签名 - 【使用已注册公钥的用户所进行的操作】
将消息加密后发送给接收者
验证数字签名
- 【注册公钥的用户所进行的操作】
- 认证机构:生成并颁发证书、查询证书状态、作废证书CRL(Certificate Revocation List)
- RA:证书注册、录入、审核、下载
- 仓库Key Management :保存证书目录
证书的层级结构:根CA自签名,然后下级单位用上级的数字签名附带自己的公钥
证书下载协议:LDAP
证书查询状态:OCSP
攻击:公钥注册前进行攻击;注册相似人名;窃取认证机构私钥;伪装成认证机构;钻CRL空子时间差;