生日攻击

生日攻擊是密碼學的一種破譯手段，利用了機率論中的生日問題，用於干擾兩個或以上群體之間的通訊。此攻擊是對固定的重新排列模式作隨機嘗試攻擊，仰賴較高的命中率（鴿籠原理）。生日攻擊可在等級的時間內找到雜湊碰撞，低於原像攻擊的 。有研究給出一個籠統（但尚存爭議）的估計，表示量子電腦能夠進行生日攻擊，進而可以破解防雜湊碰撞的抵禦，並能把時間壓縮到  的等級。

理解問題 

舉個例子：當老師問一個有30名學生的班級（n = 30）每個人的生日在哪一天（為簡便，此處省略閏年）以確定是否有兩個學生同一天生日（對應碰撞	）。從直覺角度考慮，機率看起來很小。若老師選擇特定日期（例如9月16日），則至少有一名學生在那天出生的概率是，約為7.9%。但是，與我們的直覺相反的是，至少一名學生和另外任意一名學生有著相同生日的概率大約為70.63%（n = 30時），從方程 中可看出。

數學 
定函数，攻击目标是找到符合的两个不同输入值。这一对被称之为碰撞。找出一對碰撞的方法可以是，隨機或偽隨機地輸入不同的數值，直到找出至少兩個相同的結果為止。但由於生日問題，這種方法的效率不高。明確的說，若函数所拥有的的不同输出有着相同可能性且足够大的话，我们可估計出，要取得符合的一对不同的自变量和，函数平均需要大约个不同个自变量。

思考下面一个实验。从下列的H数集中我们将随机均匀地选择n个值，因此将允许重复。使p（n; H）成为此实验中至少一个值被选择多于一次的概率。则概率可估计为

 

使n（p; H）为我们将选择的最小数值，这种情况下找到碰撞的概率至少为 p。通过颠倒上方的表达式，我们得到了下列估计公式：

 

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

 

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

 

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

{| class="wikitable" style="white-space:nowrap; text-align:center;"
|-
! rowspan="2"  style="background:lightgrey;" | 位数
! rowspan="2"  style="background:lightgrey;" | 可能输出（H）
! colspan="10" style="background:lightgrey;" | 期望的随机碰撞可能性（2安全系数）（p）
|- style="background:lightgrey;"
! 10−18
! 10−15
! 10−12
! 10−9
! 10−6
! 0.1%
! 1%
! 25%
! 50%
! 75%
|-
| style="background:lightgrey;" | 16
| style="background:lightgrey;" | 216 (~6.5 x 104)
| <2
| <2
| <2
| <2
| <2
| 11
| 36
| 190
| 300
| 430
|-
| style="background:lightgrey;" | 32
| style="background:lightgrey;" | 232 （~4.3 × 109）
| <2
| <2
| <2
| 3
| 93
| 2900
| 9300
| 50,000
| 77,000
| 110,000
|-
| style="background:lightgrey;" | 64
| style="background:lightgrey;" | 264 （~1.8 × 1019）
| 6
| 190
| 6100
| 190,000
| 6,100,000
| 1.9 × 108
| 6.1 × 108
| 3.3 × 109
| 5.1 × 109
| 7.2 × 109
|-
| style="background:lightgrey;" | 128
| style="background:lightgrey;" | 2128 （~3.4 × 1038）
| 2.6 × 1010
| 8.2 × 1011
| 2.6 × 1013
| 8.2 × 1014
| 2.6 × 1016
| 8.3 × 1017
| 2.6 × 1018
| 1.4 × 1019
| 2.2 × 1019
| 3.1 × 1019
|-
| style="background:lightgrey;" | 256
| style="background:lightgrey;" | 2256 （~1.2 × 1077）
| 4.8 × 1029
| 1.5 × 1031
| 4.8 × 1032
| 1.5 × 1034
| 4.8 × 1035
| 1.5 × 1037
| 4.8 × 1037
| 2.6 × 1038
| 4.0 × 1038
| 5.7 × 1038
|-
| style="background:lightgrey;" | 384
| style="background:lightgrey;" | 2384 （~3.9 × 10115）
| 8.9 × 1048
| 2.8 × 1050
| 8.9 × 1051
| 2.8 × 1053
| 8.9 × 1054
| 2.8 × 1056
| 8.9 × 1056
| 4.8 × 1057
| 7.4 × 1057
| 1.0 × 1058
|-
| style="background:lightgrey;" | 512
| style="background:lightgrey;" | 2512 （~1.3 × 10154）
| 1.6 × 1068
| 5.2 × 1069
| 1.6 × 1071
| 5.2 × 1072
| 1.6 × 1074
| 5.2 × 1075
| 1.6 × 1076
| 8.8 × 1076
| 1.4 × 1077
| 1.9 × 1077
|}
表格展示了需要达到给定成功可能性的哈希数量n(p)，且假设所有哈希均有相同概率。为了比较，通常一块硬盘的不可修正比特错误率为10−18至10−15。理论上说，使用128位的MD5哈希或通用唯一识别码将在8200亿份文档时得到破解，即使它们的可能输出还要更多。''

显而易见，若函数的输出不平均分布，碰撞则可能将被更快找到。哈希函数的“平衡”概念量化了其能抵御生日攻击（攻击平均的密钥分布）的次数。然而，确定哈希函数的平衡将需要计算所有输入，因此这种方法对于诸如MD及SHA系的流行哈希函数是不切实际的。
当计算中的子表达式翻译到常见的编程语言如log(1/(1-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

简单估计
一项經驗法則可适用于此关系中的心算流程

可改写为

.

或

.

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

此近似方案在使用指数时可轻易使用。例如，假设您正构建32位哈希（）且希望碰撞概率为100万分之一（），则最多我们需要多少份文档？

即与正确答案93次近似。

数字签名敏感度
數位簽章可对生日攻击十分敏感。设想一条被首次计算（为密碼雜湊函數）所签名的信息，且随后又使用了一些密钥来签名。假设愛麗絲與鮑伯牵涉到签名詐騙合同。马洛里准备了一份正常合同和一份伪造合同。馬洛里随后发现所在的位置数可在不改变原意的情况下（如插入逗号、清空行、在句后增加一两个空格、替换同义词等等）被更改。通过结合这些更改，她可新建诸多的变体且均为正常合同。

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

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

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

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

离散对数的波拉德ρ算法是使用生日攻击以计算离散对数的算法。

另请参阅
 
 中途相遇攻擊

脚注

参考文献
 ，《等一下：哈希函数平衡及其对生日攻击的影响》（Tadayoshi Kohno: Hash Function Balance and Its Impact on Birthday Attacks）  2004: pp401–418
 《应用密码学》, 第二版。（Applied Cryptography, 2nd ed.） 布魯斯·施奈爾所著

外部链接
 "What is a digital signature and what is authentication?" 来自加密的常見問題集。
 "Birthday Attack"  X5网络加密问答

密码分析

de:Kollisionsangriff#Geburtstagsangriff