关于单向散列函数和Keccak的攻击

一 对Keccak的攻击

Keccak之前的单向散列函数都是通过循环执行压缩函数的方式来生成散列值,这种方式称为MD结构。MD4、MD5、RIPEMD、RIPRMD-160、SHA-1、SHA-2等几乎所有的传统单向散列函数都是基于MD结构的。

当初之所以开始征集SHA-3算法,就是因为针对当时广泛使用SHA-1算法已经出现了理论上可行的攻击方法。为了避免SHA-1的风险,SHA-2出现了,但SHA-2依然是基于和SHA-1相同的MD结构,针对SHA-1的攻击方式很有可能也适用于SHA-2,问题没有得到根本解决。

Keccak采用了和MD结构完全不同的海绵结构,因此针对SHA-1的攻击方法对Keccak是无效的。

到目前为止,还没有出现对实际运用中的Keccak算法形成威胁的攻击方法。

二 对缩水版Keccak攻击竞赛

通过设计一个比实际作为SHA-3标准运用的Keccak强度低一些版本,并尝试对其进行攻击,就可以据此来评估实际运用的标准版Keccak·的强度。

Keccak的设计者举办了相关竞赛,内容就是对缩水版Keccak进行攻击。在竞赛中使用的缩水版Keccak比标准版减少了迭代轮数,参数者可以通过改变宽度b等各种方法来进行攻击。

Keccak被选为SHA-3标准的其中一个原因就是“结构清晰,易于分析”。这个原因好像有点违背常识,因为“易于分析”也就表示“容易找到弱点”。而一个容易找到弱点的算法为什么会被选为SHA-3呢?其实,正是因为可以比较容易地分析缩水版的Keccak,也就能够比较容易地对实际运用的标准版算法的强度进行评估,而作为一个将在全世界广泛使用的单向散列函数算法,“易于分析”可以说是一个十分优秀的特性。

三 应该使用哪种单向散列函数

首先,MD5是不安全的,因此不应该使用。

SHA-1除了对过去生成的散列值进行校验之外,不应该被用于新的用途,而是应该迁移到SHA-2.

SHA-2有效应对了针对SHA-1的攻击方法,因此是安全的,可以使用。

SHA-3是安全的,可以使用。

和对称密码算法一样,不应该使用任何自制算法。

四 对单向散列函数的攻击

1 暴力破解

故事场景

Alice写了一份合同:“Alice要支付金额100万美元”,并将其散列值安全保存。

Mallory拟定多份冗余假合同:

“Alice要支付的金额为1亿元。”

“Alice要支付的金额壹亿元”

“Alice要支付的金额:1亿元”

......

“Alice应该支付1亿元”

Mallory利用文档的冗余性,通过机器生成一大堆“支付1亿元合同”。

如果在这一大堆的合同中,能够找到一个合同和Alice原本的“Alice要支付金额100万美元”恰好产生相同的散列值,那么Mallory就算成功了,因为这样就可以天衣无缝地用1亿元合同来代替100万元合同。替换了文件之后,Mallory消无声息地离开。到此,文件的内容就被成功篡改了。

在这个故事中,用人类能够读懂的合同作为例子。然而无论人类是否能够读懂,任何文件都或多或少具有一定冗余性。利用文件的冗余性生成具有相同散列值的另一个文件,这就是一种针对单向散列函数的攻击。

这里Mallory所进行的攻击,就是暴力破解。

针对这个故事,Mallory需要寻找的就是和“100万元合同”具备相同散列值的另一条不同的消息。这相对于一种试图破解单向散列函数的“弱抗碰撞性”的攻击。在这种情况下,暴力破解需要尝试的次数可以根据散列值的长度计算出来。以SHA3-512为例,由于它的散列值长度为512比特,因此最多只要尝试2的512次方就能够找到目标消息了,如果多的尝试次数在现实中是不可能完成的。

2 生日攻击

故事场景

编写合同的人不是Alice而是主动攻击者Mallory。他事先准备了两份具备相同散列值的“100万元合同”和“一亿元合同”,然后将“100万元合同”交给Alice让她计算散列值。随后,Mallory再像故事1中一样,把“100万合同”掉包成“1亿元合同”。

在这里,Mallory所进行的攻击不是寻找生成特定散列值的消息,而是找到散列值相同的两条消息,而散列值则可以是任意的。这样的攻击,一般称为生日攻击或者冲突攻击,这是一种试图破解单向散列函数的“强抗碰撞性”的攻击。

生日问题

设想随机选出N个人组成一个集合,在这N个人中,如果要保证至少有两个人生日一样的概率大于二分之一,那么N至少是多少?

计算方法:

1-365*364*......(365-N+1)/365*365*......365=0.5

当N取23时,这个值约等于0.507,大于0.5,也就是说23个人,保证了至少有两人生日一样的概率大于二分之一。

问题转换:假设一年的天数为Y天,那么N人的集合中至少有两个人生日一样的概率大于二分之一时,N至少是多少。

当Y非常大时,近似的计算结果为:

N=Y平方根(一年天数的平方根)

回到生日攻击问题。

假设Alice所使用的单向散列函数的散列长度为M比特,则M比特所能产生的全部散列值的个数为2的M次方。

因此当N=Y的平方根=2的M次方的平方根=2的(M/2)次方

因此当N为2的(M/2)次方时候,Mallory的生日攻击就会有二分之一的概率能够成功。

和暴力破解相比,生日攻击所需的尝试次数要少得多。

 

你可能感兴趣的:(安全)