生日攻击

✍ dations ◷ 2024-12-22 23:38:08 #密码分析

生日攻击是一种密码学攻击手段,所利用的是概率论中生日问题的数学原理。这种攻击手段可用于滥用两个或多个集团之间的通信。此攻击依赖于在随机攻击中的高碰撞概率和固定置换次数(鸽巢原理)。使用生日攻击,攻击者可在 2 n = 2 n / 2 {\textstyle {\sqrt {2^{n}}}=2^{n/2}} 一名学生有着相同生日的概率大约为70.63%(n = 30时),从方程 1 365 ! ( 365 n ) ! 365 n {\displaystyle 1-{\frac {365!}{(365-n)!\cdot 365^{n}}}} 数集中我们将随机均匀地选择个值,因此将允许重复。使(; )成为此实验中至少一个值被选择多于一次的概率。则概率可估计为

使(; )为我们将选择的最小数值,这种情况下找到碰撞的概率至少为 。通过颠倒上方的表达式,我们得到了下列估计公式:

将碰撞概率设为0.5我们将得到

使()成为我们在寻找首次碰撞前所期望的值的数量。此数量可通过下列公式进行估计:

举个例子,若使用64位哈希,则估计将有1.8 × 1019个不同的输出。若这些输出均可能发生(理想情况下),则攻击者“仅仅”需要约50亿次尝试(5.38 × 109)就能通过暴力攻击生成碰撞。此值被称为 生日界限(birthday bound)而对于位密码则需要2/2次。下列举出其他例子

显而易见,若函数的输出不平均分布,碰撞则可能将被更快找到。哈希函数的“平衡”概念量化了其能抵御生日攻击(攻击平均的密钥分布)的次数。然而,确定哈希函数的平衡将需要计算所有输入,因此这种方法对于诸如MD及SHA系的流行哈希函数是不切实际的。当计算 n ( p ; H ) {\displaystyle n(p;H)} 中的子表达式 ln 1 1 p {\displaystyle \ln {\frac {1}{1-p}}} 翻译到常见的编程语言如log(1/(1-p))下,公式由于有效位丢失(英语:loss of significance)对较小的 p {\displaystyle p} 的计算精度不高。例如,当log1p(如C99中一样)可用时,应直接使用可达到相同效果的表达式-log1p(-p)。 If this is not done, the first column of the above table is computed as zero, and several items in the second column do not have even one correct significant digit.

下列是能准确生成上方表格中大多数数值的Python函数:

from math import log1p, sqrtdef birthday(probability_exponent, bits):    probability = 10.0**probability_exponent    outputs = 2.0**bits    return sqrt(2.0*outputs*-log1p(-probability))

若代码保存在命名为birthday.py的文件中,您可和下面的例子一样交互运行此程序:

$ python -i birthday.py>>> birthday(-15, 128)824963474247.1193>>> birthday(-6, 32)92.68192319417072

简单估计

一项经验法则可适用于此关系中的心算流程

可改写为

此公式在概率小于等于0.5时有效。

此近似方案在使用指数时可轻易使用。例如,假设您正构建32位哈希( H = 2 32 {\displaystyle H=2^{32}} )且希望碰撞概率为100万分之一( p 2 20 {\displaystyle p\approx 2^{-20}} ),则最多我们需要多少份文档?

即与正确答案93次近似。

数字签名可对生日攻击十分敏感。设想一条被首次计算 f ( m ) {\displaystyle f(m)} f {\displaystyle f} 为密码散列函数)所签名的信息,且随后又使用了一些密钥来签名 f ( m ) {\displaystyle f(m)} 。假设爱丽丝与鲍伯牵涉到签名诈骗合同。马洛里准备了一份正常合同 m {\displaystyle m} 和一份伪造合同 m {\displaystyle m'} 。她随后发现 m {\displaystyle m} 所在的位置数可在不改变原意的情况下(如插入逗号、清空行、在句后增加一两个空格、替换同义词等等)被更改。通过结合这些更改,她可新建诸多 m {\displaystyle m} 的变体且均为正常合同。

相似情况下,马洛里也为伪造合同 m {\displaystyle m'} 新建了诸多变体。她随后应用哈希函数到所有变体直到她找到与正常合同有着相同哈希值 f ( m ) = f ( m ) {\displaystyle f(m)=f(m')} 的伪造合同位置。她随后将正常合同带给鲍勃签名。在鲍勃签名完后,马洛里将签名取下并依附到伪造签名上。此签名“证实了”鲍勃签署了伪造合同。

此例中,攻击概率与原始的生日问题稍有不同,因为马洛里将在寻找两份具有相同哈希的正常合同与伪造合同时将一无所获。马洛里的策略是生成一份伪造和一份正常的合同。生日问题公式适用于 n {\displaystyle n} 为合同对数的情况下。但马洛里所生成的哈希数实际上为 2 n {\displaystyle 2n}

为避免这种攻击,用于签名方案的哈希函数的输出长度应够大以从计算角度防止生日攻击。换言之,位数应为防止普通暴力破解所需位数的两倍。

除了使用更大的位数长度外,签名者(鲍勃)可以在签名前做出一些随机且无害的更改,并且在自己的手上留下一份合同副本以在法庭上展示出他的签名与正常合同上的匹配,而不匹配伪造合同。

离散对数 Pollard Rho 算法是一项使用生日攻击以计算离散对数的算法。

相关