生日攻击

生日攻擊是密碼學的一種破譯手段，利用了機率論中的生日問題，用於干擾兩個或以上群體之間的通訊。此攻擊是對固定的重新排列模式作隨機嘗試攻擊，仰賴較高的命中率（鴿籠原理）。生日攻擊可在 2 n = 2 n / 2 {\textstyle {\sqrt {2^{n}}}=2^{n/2}} 等級的時間內找到雜湊碰撞，低於原像攻擊的 2 n {\textstyle 2^{n}} 。有研究給出一個籠統（但尚存爭議）的估計，表示量子電腦能夠進行生日攻擊，進而可以破解防雜湊碰撞的抵禦，並能把時間壓縮到 2 n 3 = 2 n / 3 {\textstyle {\sqrt[{3}]{2^{n}}}=2^{n/3}} 的等級。 舉例：當老師問一個有30名學生的班級（n = 30）每個人的生日在哪一天（為簡便，此處省略閏年）以確定是否有兩個學生同一天生日（對應碰撞 ）。從直覺角度考慮，機率看起來很小。若老師選擇特定日期（例如9月16日），則至少有一名學生在那天出生的概率是 1 − ( 364 / 365 ) 30 {\displaystyle 1-(364/365)^{30}} ，約為7.9%。但是，與直覺相反的是，至少一名學生和另外任意一名學生有著相同生日的概率大約為70.63%（n = 30時），從方程 1 − 365 ! ( 365 − n ) ! ⋅ 365 n {\displaystyle 1-{\frac {365!}{(365-n)!\cdot 365^{n}}}} 中可看出。 定函数 f {\displaystyle f} ，攻击目标是找到符合 f ( x 1 ) = f ( x 2 ) {\displaystyle f(x_{1})=f(x_{2})} 的两个不同输入值 x 1 , x 2 {\displaystyle x_{1},x_{2}} 。这一对 x 1 , x 2 {\displaystyle x_{1},x_{2}} 被称之为碰撞。找出一對碰撞的方法可以是隨機或偽隨機地輸入不同的數值，直到找出至少兩個相同的結果為止。但由於生日問題，這種方法的效率不高。明確的說，若函数 f ( x ) {\displaystyle f(x)} 所拥有的 H {\displaystyle H} 的不同输出有着相同可能性且 H {\displaystyle H} 足够大，要取得符合 f ( x 1 ) = f ( x 2 ) {\displaystyle f(x_{1})=f(x_{2})} 的一对不同的自变量 x 1 {\displaystyle x_{1}} 和 x 2 {\displaystyle x_{2}} ，函数平均需要大约 1.25 H {\displaystyle 1.25{\sqrt {H}}} 个不同个自变量。 思考下面一个实验。从下列的H数集中随机均匀地选择n个值，因此将允许重复。使p（n; H）成为此实验中至少一个值被选择多于一次的概率。则概率可估计为 p ( n ; H ) ≈ 1 − e − n ( n − 1 ) / ( 2 H ) ≈ 1 − e − n 2 / ( 2 H ) {\displaystyle p(n;H)\approx 1-e^{-n(n-1)/(2H)}\approx 1-e^{-n^{2}/(2H)}} 使n（p; H）为将选择的最小数值，这种情况下找到碰撞的概率至少为 p。通过颠倒上方的表达式，可得到了下列估计公式： n ( p ; H ) ≈ 2 H ln ⁡ 1 1 − p {\displaystyle n(p;H)\approx {\sqrt {2H\ln {\frac {1}{1-p}}}}} 将碰撞概率设为0.5，将得到 n ( 0.5 ; H ) ≈ 1.1774 H {\displaystyle n(0.5;H)\approx 1.1774{\sqrt {H}}} 使Q（H）成为在寻找首次碰撞前所期望的值的数量。此数量可通过下列公式进行估计： Q ( H ) ≈ π 2 H {\displaystyle Q(H)\approx {\sqrt {{\frac {\pi }{2}}H}}} 举例：若使用64位哈希，则估计将有1.8 × 1019个不同的输出。若这些输出均可能发生（理想情况下），则攻击者“仅仅”需要约50亿次尝试（5.38 × 109）就能通过暴力攻击生成碰撞。此值被称为 生日界限（birthday bound）而对于n位密码则需要2n/2次。下列举出其他例子 表格展示了需要达到给定成功可能性的哈希数量n(p)，且假设所有哈希均有相同概率。为了比较，通常一块硬盘的不可修正比特错误率为10−18至10−15。理论上说，使用128位的MD5哈希或通用唯一识别码将在8200亿份文档时得到破解，即使它们的可能输出还要更多。 显而易见，若函数的输出不平均分布，碰撞则可能将被更快找到。哈希函数的“平衡”概念量化了其能抵御生日攻击（攻击平均的密钥分布）的次数。然而，确定哈希函数的平衡将需要计算所有输入，因此这种方法对于诸如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, sqrt def 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 一项經驗法則可适用于此关系中的心算流程 p ( n ) ≈ n 2 2 H {\displaystyle p(n)\approx {n^{2} \over 2H}} 可改写为 H ≈ n 2 2 p ( n ) {\displaystyle H\approx {n^{2} \over 2p(n)}} . 或 n ≈ 2 H × p ( n ) {\displaystyle n\approx {\sqrt {2H\times p(n)}}} . 此公式在概率小于等于0.5时有效。 此近似方案在使用指数时可轻易使用。例如，假设构建32位哈希（ H = 2 32 {\displaystyle H=2^{32}} ）且希望碰撞概率为100万分之一（ p ≈ 2 − 20 {\displaystyle p\approx 2^{-20}} ），则最多需要多少份文档？ n ≈ 2 × 2 32 × 2 − 20 = 2 1 + 32 − 20 = 2 13 = 2 6.5 ≈ 90.5 {\displaystyle n\approx {\sqrt {2\times 2^{32}\times 2^{-20}}}={\sqrt {2^{1+32-20}}}={\sqrt {2^{13}}}=2^{6.5}\approx 90.5} 即与正确答案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} 。 为避免这种攻击，用于签名方案的哈希函数的输出长度应够大以从计算角度防止生日攻击。换言之，位数应为防止普通暴力破解所需位数的两倍。 除了使用更大的位数长度外，签名者（鲍勃）可以在签名前做出一些随机且无害的更改，并且在自己的手上留下一份合同副本以在法庭上展示出他的签名与正常合同上的匹配，而不匹配伪造合同。 离散对数的波拉德ρ算法是使用生日攻击以计算离散对数的算法。 碰撞攻击（英语：Collision attack） 中途相遇攻擊 Daniel J. Bernstein. Cost analysis of hash collisions : Will quantum computers make SHARCS obsolete? (PDF). Cr.yp.to. [29 October 2017]. （原始内容存档 (PDF)于2017-08-25）.  Brassard, Gilles; HØyer, Peter; Tapp, Alain. Quantum cryptanalysis of hash and claw-free functions. Springer, Berlin, Heidelberg: 163–169. 20 April 1998 [29 October 2017]. doi:10.1007/BFb0054319. （原始内容存档于2020-08-08）.  Math Forum: Ask Dr. Math FAQ: The Birthday Problem. Mathforum.org. [29 October 2017]. （原始内容存档于2013-07-22）.  请参阅上界和下界。 Jacques Patarin, Audrey Montreuil. Benes and Butterfly schemes revisited (PostScript, 可移植文档格式). Université de Versailles. 2005 [2007-03-15]. （原始内容存档于2007-09-29）.  Gray, Jim; van Ingen, Catharine. Empirical Measurements of Disk Failure Rates and Error Rates. 25 January 2007. arXiv:cs/0701166 .  Archived copy. [2006-05-02]. （原始内容存档于2008-02-23）.  Compute log(1+x) accurately for small values of x. Mathworks.com. [29 October 2017]. （原始内容存档于2012-08-30）.  米希尔·贝拉尔（英语：Mihir Bellare），《等一下：哈希函数平衡及其对生日攻击的影响》（Tadayoshi Kohno: Hash Function Balance and Its Impact on Birthday Attacks） EUROCRYPT（英语：EUROCRYPT） 2004: pp401–418 《应用密码学》, 第二版。（Applied Cryptography, 2nd ed.） 布魯斯·施奈爾所著 "What is a digital signature and what is authentication?" 来自RSA安全（英语：RSA (security firm)）加密的常見問題集。 "Birthday Attack" （页面存档备份，存于互联网档案馆） X5网络加密问答