尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Cryptohack 密码学挑战 Write-Up:Jack‘s Birthday Confusion
1. 题目信息挑战名称Jacks Birthday Confusion所属分类Hash Functions哈希函数难度入门级链接CryptoHack – Challenges2. 题目描述Jack 设计了一个名为JACK11的哈希算法它产生11 位的固定长度输出即 11 个比特。题目问给定没有其他关于JACK11算法的信息平均需要尝试多少个不同的秘密值才能有75% 的概率发生一次碰撞即两个不同的秘密产生相同的哈希值我们需要利用生日悖论Birthday Paradox来计算这个值。3. 前置知识3.1 生日悖论Birthday Paradox生日悖论指出在一个房间里只需要23 个人就能有超过 50% 的概率找到两个生日相同的人。这看似反直觉但数学上完全成立。核心思想碰撞概率增长的速度比线性快得多因为我们需要考虑所有可能的配对。3.2 通用公式对于输出空间大小为 NN 的哈希函数当我们尝试 kk 个不同的输入时至少发生一次碰撞的概率为P(碰撞)≈1−e−k(k−1)/(2N)P(碰撞)≈1−e−k(k−1)/(2N)当 k≪Nk≪N 时这个近似非常精确。更精确的公式是P(碰撞)1−∏i0k−1(1−iN)P(碰撞)1−i0∏k−1​(1−Ni​)3.3 输出空间大小JACK11产生 11 位输出因此输出空间大小为N2112048N2112048这意味着哈希值可以是 0 到 2047 之间的任意整数。4. 解题过程4.1 已知条件哈希输出长度11 位输出空间大小N2112048N2112048目标概率75%即 0.75我们需要找到最小的 kk使得P(至少一次碰撞)≥0.75P(至少一次碰撞)≥0.754.2 使用近似公式1−e−k(k−1)/(2N)0.751−e−k(k−1)/(2N)0.75e−k(k−1)/(2N)0.25e−k(k−1)/(2N)0.25两边取自然对数−k(k−1)2Nln⁡(0.25)−2Nk(k−1)​ln(0.25)k(k−1)2N−ln⁡(0.25)ln⁡(4)≈1.3862942Nk(k−1)​−ln(0.25)ln(4)≈1.386294k(k−1)2N⋅ln⁡(4)2×2048×1.386294≈5677.54k(k−1)2N⋅ln(4)2×2048×1.386294≈5677.54k2−k−5677.540k2−k−5677.540用求根公式k114×5677.542122711.162k2114×5677.54​​2122711.16​​1150.7022≈75.8521150.702​≈75.85因为 kk 必须是整数所以 k76k76。也就是说尝试 76 个不同的秘密值恰好有 75% 的概率发生碰撞。4.3 精确计算验证用 Python 精确计算pythonimport math N 2 ** 11 # 2048 def collision_probability(k, N): # 精确计算没有碰撞的概率 no_collision 1.0 for i in range(k): no_collision * (N - i) / N return 1 - no_collision def find_k(target_prob, N): k 1 while True: prob collision_probability(k, N) if prob target_prob: return k, prob k 1 target 0.75 k, prob find_k(target, N) print(f需要 {k} 个值才能达到 {target*100:.0f}% 的碰撞概率) print(f实际概率: {prob:.6f}) # 输出: # 需要 76 个值才能达到 75% 的碰撞概率 # 实际概率: 0.7503344.4 关于平均的说明题目问的是平均需要多少个秘密值。在概率统计中我们可以通过上述公式计算出达到特定概率所需的尝试次数。对于 75% 的概率答案是76。但要注意平均在这里可以理解为如果我们重复进行多次实验每次随机选择秘密值大约 75% 的实验会在尝试到第 76 个值时发生碰撞。4.5 可视化pythonimport matplotlib.pyplot as plt import numpy as np N 2048 k_values range(1, 200) probs [collision_probability(k, N) for k in k_values] plt.figure(figsize(10, 6)) plt.plot(k_values, probs, linewidth2) plt.axhline(y0.75, colorr, linestyle--, label75% 目标) plt.axvline(x76, colorg, linestyle--, labelk 76) plt.xlabel(尝试次数 k) plt.ylabel(碰撞概率) plt.title(JACK11 碰撞概率 vs 尝试次数 (N2048)) plt.grid(True, alpha0.3) plt.legend() plt.show()5. 两种常见的误解5.1 误解一50% 概率需要 NN​ 个值许多人会记住50% 碰撞概率需要约 NN​ 个值即 2048≈45.252048​≈45.25。这是因为当 k≈Nk≈N​ 时碰撞概率约为 50%。这个近似来自P≈1−e−k2/(2N)P≈1−e−k2/(2N)当 kNkN​ 时P≈1−e−1/2≈0.3935P≈1−e−1/2≈0.3935实际上只有 39%。更准确的近似是 k≈2Nln⁡2≈2×2048×0.693≈2837≈53k≈2Nln2​≈2×2048×0.693​≈2837​≈53。5.2 误解二75% 概率是 50% 概率的 1.5 倍这是错误的概率增长不是线性的。要达到 75% 的概率需要比 50% 多很多尝试。具体来说50% 概率约 54 个值75% 概率约 76 个值90% 概率约 97 个值99% 概率约 137 个值6. 答案推导总结步骤计算结果1输出位数112输出空间大小211204821120483碰撞概率公式P1−e−k(k−1)/(2N)P1−e−k(k−1)/(2N)4代入目标概率1−e−k(k−1)/40960.751−e−k(k−1)/40960.755解方程k≈75.85k≈75.856向上取整k76k767. 扩展思考7.1 通用公式对于任意输出空间大小 NN要达到碰撞概率 PP 所需的尝试次数 kk 为k≈⌈2N⋅ln⁡(11−P)⌉k≈⌈2N⋅ln(1−P1​)​⌉对于本题k⌈2×2048×ln⁡(10.25)⌉⌈4096×ln⁡(4)⌉⌈5677.54⌉⌈75.35⌉76k⌈2×2048×ln(0.251​)​⌉⌈4096×ln(4)​⌉⌈5677.54​⌉⌈75.35⌉767.2 生日悖论在密码学中的意义生日悖论直接影响哈希函数的安全性碰撞攻击对于 nn 位的哈希函数攻击者只需要尝试 2n/22n/2 次就能以 50% 概率找到碰撞而不是 2n2n 次。安全标准这就是为什么现代哈希函数如 SHA-256需要至少 256 位输出使得攻击者需要尝试 21282128 次这在计算上不可行。密码存储在密码哈希中也需要考虑生日攻击因此通常使用加盐salt来增加攻击难度。7.3 不同概率对应的尝试次数N2048概率尝试次数 k近似公式10%212N⋅0.1052N⋅0.105​25%342N⋅0.2882N⋅0.288​50%542N⋅0.6932N⋅0.693​75%762N⋅1.3862N⋅1.386​90%972N⋅2.3032N⋅2.303​95%1112N⋅2.9962N⋅2.996​99%1382N⋅4.6052N⋅4.605​8. 相关代码速查python# 计算 75% 碰撞概率所需尝试次数 import math N 2 ** 11 P 0.75 k math.ceil(math.sqrt(2 * N * math.log(1 / (1 - P)))) print(k) # 输出: 76 # 验证概率 def prob_collision(k, N): return 1 - math.exp(-k * (k - 1) / (2 * N)) print(prob_collision(k, N)) # 输出: 0.7503349. 答案text7610. 参考资源Cryptohack - Hash Functions 系列Birthday Attack - WikipediaBirthday Problem - WikipediaNIST SP 800-107: Recommendation for Applications Using Approved Hash Algorithms
RELATED

相关推荐

修复指南:解决打开软件提示丢失 `api-ms-win-devices-query-l1-1-0.dll` 报错

修复指南:解决打开软件提示丢失 `api-ms-win-devices-query-l1-1-0.dll` 报错

修复指南:解决打开软件提示丢失 api-ms-win-devices-query-l1-1-0.dll 报错 当打开向日葵远程控制或其他大型软件时,系统如果突然弹窗提示: “无法启动此程序,因为计算机中丢失 api-ms-win-devices-query-l1-1-0.dll” 这通常不是…

📅 2026/11/13 11:33:27
全域透视,智守高墙——黎阳之光“透明监狱”重构智慧监管新范式

全域透视,智守高墙——黎阳之光“透明监狱”重构智慧监管新范式

高墙之内,安全与规范是司法监管的核心底线。传统监狱管理长期受制于监控画面割裂、人员追踪断档、隐蔽区域管控盲区、预警滞后、数据互不互通等痛点,二维碎片化监控难以实现全域立体管控,人工巡查成本高、风险预判能力薄弱。北京黎阳之光依托…

📅 2026/11/12 8:30:14
OWTB 3PL 智慧仓储管理系统 - 全设备清单本清单

OWTB 3PL 智慧仓储管理系统 - 全设备清单本清单

本清单基于3PL多货主、多业态作业特性,与OWTB系统(yudao-cloud ccsoft-ui-admin-uniapp)深度适配,覆盖入库、存储、拣选、分拣、包装、出库全链路,并包含AI员工所需的IoT感知设备。一、设备分类总览设备大类核心作用关…

📅 2026/11/12 14:48:02
MORE NEWS

更多资讯

📰

国家安全局高压电工证合格标准与通过率

工地太忙根本没时间复习考试?2026河南最新政策下高压电工证怎么考 工地太忙根本没时间复习考试?尤其是河南的工友,2026年新规一出,高压电工证办理和考试流程变了,如果你还在等时间,可能已经被淘汰了。别慌,下面一步步教你搞定。…

📰

操作类别高压电工作业合格标准与通过率

高压电工作业证书过期了不知道怎么复审延期?真实经历告诉你怎么处理 证书过期了不知道怎么复审延期?这事儿真不是闹着玩的。上周我朋友老张就因为高压电工作业证没及时复审,被临时工队直接辞退了,连工钱都没结清。他跟我说,当时他以为证书过期了还能补办…

📰

专科生电工证怎么考取 官方报名入口在哪找

专科生电工证怎么考取 官方报名入口在哪找 实操考试心里没底怕挂科,这可能是很多专科生报考电工证时最真实的想法。尤其是刚毕业的你,面对高压电、电缆接线这些实操项目,不知道从哪里下手,更担心考试不过。但别急,其实只要掌握正确的方法,…

📰

上海普陀区高压电工证到期换证流程揭秘:外省证能转吗?

上海普陀区高压电工证到期换证流程揭秘:外省证能转吗? 之前考的证在外省能不能转过来?这几乎是每个准备在上海普陀区换证的高压电工证持有者最关心的问题。别急,这背后还真有门道,尤其是现在 通过率揭秘 后,很多细节都被扒得一清二楚。…

📰

电工证年审哪些流程?考前押题怎么用最省心

电工证年审哪些流程?考前押题怎么用最省心 你是不是也担心电工证年审要跑多少地方,怕被中介坑?别急,这篇就告诉你最省心的年审流程,还有考前押题怎么用才不浪费。不管是刚考完证的新手,还是打算复审的老电工,这篇都得看完。…

📰

3年高压电工证考复审题真实经历:别再交冤枉培训费了

3年高压电工证考复审题真实经历:别再交冤枉培训费了 怕考不过白交培训费?我就是信阳浉河区一个电工,当初也和你一样,担心交了钱考不过,结果一考就过了,还顺带摸清了高压电工证考复审题的套路。这篇文章我就从真实经历出发,帮你少走弯路,不花冤枉钱。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬