密码学之生日攻击 离散对数问题求解 python实现

article/2025/3/7 5:07:43

生日攻击

离散对数问题( DLP ) 给定素数 p, α \alpha α, β \beta β 是模 p 非零的整数,令 β = α x m o d p \beta = \alpha^x\mod p β=αxmodp ,则求 x 的问题称为离散对数问题。

生日攻击是一种密码攻击,它利用概率论中生日问题背后的数学原理。攻击取决于随机攻击中的高 碰撞 概率和固定置换次数( 鸽巢原理 )。通过生日攻击,可以在 2 n = 2 n / 2 \sqrt{2^n} = 2 ^ {n / 2} 2n =2n/2中找到哈希函数的碰撞碰撞,其中 2 n 2 ^ {n} 2n 是经典的预测阻力安全。生日攻击是用来指代一类暴力攻击的名称。它得名于一个令人惊讶的结果:在一个23人的群体中,两个或更多人拥有相同生日的概率大于1/2;这种结果被称为生日悖论。

生日问题

例如,考虑这样一个场景:一个班级有30名学生(n = 30)的教师要求每个人的生日(为简单起见,忽略闰年),以确定是否有任何两个学生具有相同的生日(对应于进一步描述的哈希冲突)。直观地说,这个机会可能看起来很小。与直觉相反,至少有一个学生的概率与任何一天的任何其他学生的生日相同,大约为70%(对于n = 30),公式 1 − 365 ! ( 365 − n ) ! ⋅ 36 5 n 1-\frac{365!}{(365-n)!·365^n} 1(365n)!365n365!

如果老师选择了一个特定的日期(比如9月16日),那么至少有一个学生出生在那个特定日期的几率是,大约是 1 − ( 364 / 365 ) 30 1 - (364/365)^{30} 1(364/365)30 7.9%。

实现

输入为生成元 α \alpha α 的阶 p − 1 p - 1 p1 和元 β \beta β;输出为离散对数 x = log ⁡ α β x = \log_\alpha \beta x=logαβ,即要求解 β ≡ α x m o d p \beta \equiv \alpha^x \mod p βαxmodp

设置两个长度为 p \sqrt p p 的列表:

  • 列表 1 包含 α k m o d p \alpha^k\mod p αkmodp,通过随机选取 p \sqrt p p k k k得到;

  • 列表 2 包含 β α − l m o d p \beta\alpha^{-l}\mod p βαlmodp,通过随机选取 p \sqrt p p l l l得到;

则 在 两 个 列 表 中 很 有 可 能 出 现 重 复 的 项 , 即 α k = β α − l \alpha^k=\beta\alpha^{-l} αk=βαl, 因 此 α k + l = β m o d p \alpha^{k+l}=\beta \mod p αk+l=βmodp,那么 x = k + l m o d ( p − l ) x=k+l \mod {(p-l)} x=k+lmod(pl)就是要找的离散对数 。

import math
import randomdef getRandomList(n):"""集合方式实现生成n个随机数"""numbers = []while len(numbers) < n:i = random.randint(0, 100)if i not in numbers:numbers.append(i)return numbersdef brithAttack(alpha, beta, p):sqrt_p = int(math.sqrt(p))# 初始化两个列表list_k_value = []list_l_value = []# 生成 sqrt(p) 长度的随机数集合list_k = getRandomList(sqrt_p)list_l = getRandomList(sqrt_p)# 生成 sqrt(p) 长度的for i in range(sqrt_p):# 计算出 alpha^k mod p并放入集合,同时在另一列表记录下kitem_k = pow(alpha, list_k[i], p)list_k_value.append(item_k)# 计算出 beta * alpha^{-l} mod p 并放入集合,同时在另一列表记录下litem_l = beta * pow(alpha, -list_l[i], p) % plist_l_value.append(item_l)print(list_k_value)print(list_l_value)# 求出合集coincide = set(list_k_value) & set(list_l_value)print(coincide)if not coincide:print("集合为空")return Falseelse:for same in coincide:k_index = list_k_value.index(same)l_index = list_l_value.index(same)k_value = list_k[k_index]l_value = list_l[l_index]x = k_value + l_valueprint("求出了x")print(x % (p - 1))return Trueif __name__ == '__main__':while True:if brithAttack(alpha=19, beta=298, p=521):break

带入数据检测发现结果正确

298 = 1 9 17 m o d 521 , 17 = log ⁡ 19 298 m o d 521 298=19^{17} \mod 521,17 = \log_{19}298 \mod 521 298=1917mod521,17=log19298mod521

在这里插入图片描述


http://chatgpt.dhexx.cn/article/2ojmgP26.shtml

相关文章

Hash函数与生日攻击

简介 Hash函数也叫杂凑函数、散列函数、哈希函数&#xff0c;可以把消息或数据压缩成固定长度的摘要 性质 等长性&#xff1a;给出任意的输入&#xff0c;得到的输出&#xff08;摘要&#xff09;长度不变。比如sha-1得到的摘要固定是160位&#xff0c;md5为128位单向性&#…

【Hash函数与生日攻击】

文章目录 一、Hash函数Hash函数关于密钥s散列函数定义碰撞发现实验-可忽略的散列函数安全性的三个典型的安全水平通用生日攻击 参考文献 一、Hash函数 Hash函数 将任意长度字符串压缩成短字符串的函数 关于密钥s 散列函数定义 碰撞发现实验-可忽略的 最强的安全性要求&…

生日攻击理解

1.什么是哈希碰撞&#xff1f;产生哈希碰撞的原因是什么&#xff1f;如何避免&#xff1f; 两个不同的输入&#xff0c;经过哈希算法后&#xff0c;得到了同样的哈希值&#xff0c;就叫做哈希碰撞。由于通常的哈希算法中&#xff0c;哈希值的空间远小于输入的空间&#xff0c;这…

哈希碰撞与生日相同概率

一、哈希碰撞是什么&#xff1f; 所谓哈希&#xff08;hash&#xff09;&#xff0c;就是将不同的输入映射成独一无二的、固定长度的值&#xff08;又称"哈希值"&#xff09;。它是最常见的软件运算之一。 如果不同的输入得到了同一个哈希值&#xff0c;就发生了&q…

密码学系列之:生日攻击

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

linux 清空redis缓存

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

【redis】linux服务器清空redis

redis-cli 进入redis命令行 flushall 清除所有 如果报出“NOAUTH Authentication required.”错误&#xff0c;那么需要用密码授权 使用 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 队列

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

教你Redis 如何清空所有数据

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

lnx的导数证明

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

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

提示&#xff1a;$f(f(f(x)-lnx)-ln(f(x)-lnx))1ef(f(x)-lnx),\because f(x)$单调.得&#xff1a; $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&…