密码学系列之:生日攻击

article/2025/3/7 5:32:33

简介

生日攻击其实是一个概率论的问题,也就是说一个看起来很难发生的事情,事实上它发生的概率却很大。这种主观上和事实上的概率差距,让随机攻击成功的几率变的更高,这样的攻击就叫做生日攻击。

生日问题的由来

生日问题也叫做生日悖论,它是这样这样描述的。

假如随机选择n个人,那么这个n个人中有两个人的生日相同的概率是多少。如果要想概率是100%,那么只需要选择367个人就够了。因为只有366个生日日期(包括2月29日)。

如果想要概率达到99.9% ,那么只需要70个人就够了。50%的概率只需要23个人。

对于现在的幼儿园小朋友来说,一个班上差不多有30人,那么将会有大于50%的几率,班上有两个人的生日是一样的。

听起来是不是很神奇?跟我们第一映像中的基数是不是要少很多。

我们看一张概率图:

在实际应用中,可以应用生日问题中的概率模型,从而减少碰撞攻击的复杂度,或者来评估一个hash函数中可能出现碰撞攻击的几率。

怎么计算呢?

假如P(A) 是生日相同的概率,那么P(A) = 1 - P(A’) ,其中P(A’)是生日不同的概率。

一个人生日不同的概率是365/365,两个人生日不同的概率就是365/365 * 364/365 ,依次类推。

我们可以得到23个人生日不同的概率大概就是 0.492703。

也就是说23个人中有两个人生日相同的概率可以大于50%。

再看一张表来个更加直观的描述:

生日问题的衍生

生日问题的取值范围是在一年的365天之内,也就是说生日只可能有365种可能性。

我们将这个问题扩展一下到一般的情况,假设有一个函数f,它的输出范围是H,那么我们的攻击就是找到两个不同的x,y,让f(x)=f(y)。

这时候,我们可以称x和y发生了碰撞。

根据概率论的公式,我们想要达到50%的几率,那么需要尝试的次数是:

如果以bits位来表示可能计算出的结果的话,我们可以参考下面的概率表:

生日攻击的应用

生日攻击一般应用在数字签名中。一般来说为了对机密消息进行签名,因为加密的限制,如果消息很大的情况下,不可能对所有的消息进行签名,通常会对消息计算hash值,然后对这个hash值进行签名。

比如有人想做一个欺诈性的合同,那么会在原合同的基础上进行修改,不断的进行尝试,从而找到一个修改后的合同,让合同和之前合同的hash是一样的,从而导致两者的签名也是一样的。

怎么抵御这种攻击呢?根据我们生日攻击的公式,当然是将签名方案使用的哈希函数的输出长度选择得足够大,以使生日攻击在计算上变得不可行。

本文已收录于 http://www.flydean.com/birthday-attack/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!


http://chatgpt.dhexx.cn/article/uSfc8UTA.shtml

相关文章

linux 清空redis缓存

1,进入目录redis下src目录。 #cd redis-2.8.17/src 2,执行redis-cli文件 #./redis-cli 3,执行命令:flushall,出现OK代表执行成功 #flushall 4,退出命令exit #exit 实例:

【redis】linux服务器清空redis

redis-cli 进入redis命令行 flushall 清除所有 如果报出“NOAUTH Authentication required.”错误,那么需要用密码授权 使用 auth [密码] 就可以继续操作了

redis数据清空脚本

redis服务经常因服务器内存不够用而自动死掉。需要经常连接进去做数据清理后启动服务。 所以写了个脚本每天清理一遍。 echo "flushall" | redis-cli -p 7000 -a password echo "flushall" | redis-cli -p 7001 -a password echo "flushall" |…

docker部署python程序清空redis数据

这里还是要推荐下小编的Python学习群: 823137423,不管你是小白还是大牛,小编我都欢迎 ,不定期分享干货,包括小编自己整理的一份2019年最新的Python资料和0基础入门教程视频,欢迎初学和进阶中的小伙伴。在不忙的时间我会给大家解惑。 docker部署python程序清空redis数据 线…

Windows 清空Redis数据

1.redis安装目录下输入cmd 2.redis-cli -p 端口号 3.flushdb 清除当前数据库缓存 4.flushall 清除整个redis所有缓存

Laravel 清空 Redis 队列

先说问题,我的网站搜索使用的 Laravel Scout Algolia 因为 Algolia 是收费的,免费版有容量限制。免费版应该是如下的限制: 一旦你的 计划超出配额,那么 Laravel 队列就会一直失败。失败他会重试导致 ,队列一直累加、…

教你Redis 如何清空所有数据

这篇文章主要介绍了Redis 如何清空所有数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 Redis 清空所有数据步骤总结 1、打开cmd 命令窗口,切换至Redis 安装目录下的bin文件夹 2、在cmd 命…

lnx的导数证明

https://zhidao.baidu.com/question/524121644.html

MT【80】单调性求函数表达式

提示:$f(f(f(x)-lnx)-ln(f(x)-lnx))1ef(f(x)-lnx),\because f(x)$单调.得: $f(f(x)-lnx)-ln(f(x)-lnx)f(x)-lnx$,可以解出$f(x)ln(x)e$ 转载于:https://www.cnblogs.com/mathstudy/p/7630632.html

C语言:综合题,按x的值计算sinx,cosx,ex,lnx

0<x<10,输出sinx 10<x<20,输出cosx 20<x<30,输出ex 30<x<40,输出lnx x<0或x>40,输出zsdy #include<stdio.h> #include<math.h> int main() {double x;printf("input x");scanf("%lf",&x);if(x>0&am…

怎么用计算机算lnx,lnx等于多少怎么算

lnxloge^x。ln是一个算符&#xff0c;它的意思是求自然对数&#xff0c;即以e为底的对数。e是一个常数&#xff0c;约等于2.71828183&#xff0c;lnx可以理解为ln(x)&#xff0c;即以e为底x的对数&#xff0c;所以也就是求e的多少次方等于x。 以常数e为底数的对数叫做自然对数记…

APP专项测试——弱网测试

1.弱网测试场景 弱网测试思路可以从以上场景考虑。像模拟3G网络&#xff0c;3G、4G、5G、WiFi相互切换&#xff0c;是网络测试的基本场景&#xff1b;弱网或者无网时APP的反应时长、页面呈现、超时时间和超时文案是关乎用户体验的基本场景 2.弱网测试工具 &#xff08;1&…

Android Studio创建安卓虚拟机并测试app

首先&#xff0c;右上角点击AVD Manager。 这个界面就会显示我们已有的安卓虚拟机&#xff0c;要创建新的虚拟机&#xff0c;点击Create Virtual Device。进入下一个界面选择屏幕样式&#xff1a; 接下来是Image选择&#xff0c;为了让下载的东西小一点&#xff0c;我们选择了…

APP兼容测试

兼容性测试一般考虑&#xff1a;手机型号、操作系统、屏幕分辨率、网络、应用兼容、数据格式 一。关于原生系统的兼容&#xff1a; 1. 手机型号&#xff1a;覆盖市场主流机型&#xff08;Android&#xff1a;华为、小米、OPPO、华为.. IOS主流机型&#xff09;兼容性测试本质…

APP性能测试之monkey

APP性能测试之monkey 1 monkey 是做什么的 monkey 是 Android 中的一个命令行工具&#xff0c;由 java 编写&#xff0c;可以运行在模拟器里或实 际设备中。 它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等)&#xff0c;实现 对 APP 进行压力测试。 …

APP内存占用测试

APP内存占用测试 1 主要测试点 空闲状态 切换至后台或者启动后不做任何操作&#xff0c;消耗内存最少。 中强度状态 时间偏长的操作应用。 高强度状态 高强度使用应用&#xff0c;可以跑 monkey 来测试&#xff08;通常用来测试内存泄漏&#xff09;。 内存泄漏 指使…

5G手机网优测试软件,推荐一款5G网优测试APP— —FAT

推荐一款适用于&高&通&芯&片的4/5G网优测试APP——FAT 推荐原因&#xff1a;界面简洁&#xff0c;操作简单&#xff0c;方便快捷。 直接上图&#xff1a; 1、打点测试&#xff0c;除Speedtest外&#xff0c;Attach、Volte、Ping、FtpUp和FtpDown都可以打点测试…