首页 > 其他分享 >RSA维纳攻击

RSA维纳攻击

时间:2024-04-10 17:57:47浏览次数:19  
标签:phi pq 攻击 res numerator RSA 维纳 def

记录一下XY的维纳攻击题目
winner's acctack,维纳攻击,其原理https://zhuanlan.zhihu.com/p/400818185 这位佬写的超级详细,若需要证明过程可参考!

维纳的本质在于通过近似phi与n的值,ed = 1 + k * phi 即可化简成 e / n = k / d,其中e , n的值已知的情况下,我们可以通过求e / n的连分数来得到d的值(d包含在e / n的连分数组中),通过循环遍历k的d的值去检验e / phi = k / d,我们便可以求得phi的值,phi = n - (p + q) -1 ,得知(p + q)与 p * q 的值,我们可以通过韦达定理构造一元二次方程: x^2 + (p + q)x + pq = 0,该方程的两解必为p ,q ,从而解决问题。

给个题

题目所示

点击查看代码
p = getPrime(512)
q = getPrime(512)
d = getPrime(512)
e = gmpy2.invert(d, (p**3 - 1) * (q**3 - 1))
flag = "XYCTF{" + **hashlib**.md5(str(p + q).encode()).hexdigest() + "}"
print(e)
print(p * q)
e = 172005065945326769176157335849432320425605083524943730546805772515111751580759726759492349719668775270727323745284785341119685198468883978645793770975366048506237371435027612758232099414404389043740306443065413069994232238075194102578269859784981454218948784071599231415554297361219709787507633404217550013282713899284609273532223781487419770338416653260109238572639243087280632577902857385265070736208291583497988891353312351322545840742380550393294960815728021248513046077985900158814037534487146730483099151396746751774427787635287611736111679074330407715700153025952858666841328055071403960165321273972935204988906850585454805923440635864200149694398767776539993952528995717480620593326867245714074205285828967234591508039849777840636255379730281105670496110061909219669860172557450779495125345533232776767292561378244884362014224844319802810586344516400297830227894063759083198761120293919537342405893653545157892446163
n = 99075185389443078008327214328328747792385153883836599753096971412377366865826254033534293886034828804219037466246175526347014045811852531994537520303063113985486063022444972761276531422538694915030159420989401280012025249129111871649831185047820236417385693285461420040134313833571949090757635806658958193793

看到题目,只在知道e,n的值情况下,很容易联想到维纳攻击,但本题的e并非真实的e值,那就意味着我们通过维纳攻击求出来的phi值即为(p ** 3 - 1) * (q ** 3 - 1),运用一些数论小知识,我们不难将其化简为n ** 3 − (p+q) ** 3 + 3n * (p+q) + 1,刚好题目的flag是p + q哈希加密后的结果,所以解p + q就行啦!

下面是维纳攻击求phi的代码

点击查看代码
import gmpy2
import libnum
from Crypto.Util.number import long_to_bytes


def transform(x, y):  # 使用辗转相处将分数 x/y 转为连分数的形式
    res = []
    while y:
        res.append(x // y)
        x, y = y, x % y
    return res


def continued_fraction(sub_res):
    numerator, denominator = 1, 0
    for i in sub_res[::-1]:  # 从sublist的后面往前循环
        denominator, numerator = numerator, i * numerator + denominator
    return denominator, numerator  # 得到渐进分数的分母和分子,并返回


# 求解每个渐进分数
def sub_fraction(x, y):
    res = transform(x, y)
    res = list(map(continued_fraction, (res[0:i] for i in range(1, len(res)))))  # 将连分数的结果逐一截取以求渐进分数
    return res


def get_pq(a, b, c):  # 由p+q和pq的值通过维达定理来求解p和q
    par = gmpy2.isqrt(b * b - 4 * a * c)  # 由上述可得,开根号一定是整数,因为有解
    x1, x2 = (-b + par) // (2 * a), (-b - par) // (2 * a)
    return x1, x2


def wienerAttack(e, n):
    for (d, k) in sub_fraction(e, pow(n,3)):  # 用一个for循环来注意试探e/n的连续函数的渐进分数,直到找到一个满足条件的渐进分数
        if k == 0:  # 可能会出现连分数的第一个为0的情况,排除
            continue
        if (e * d - 1) % k != 0:  # ed=1 (mod φ(n)) 因此如果找到了d的话,(ed-1)会整除φ(n),也就是存在k使得(e*d-1)//k=φ(n)
            continue

        phi = (e * d - 1) // k  # 这个结果就是 φ(n)

        print(phi)





e = 172005065945326769176157335849432320425605083524943730546805772515111751580759726759492349719668775270727323745284785341119685198468883978645793770975366048506237371435027612758232099414404389043740306443065413069994232238075194102578269859784981454218948784071599231415554297361219709787507633404217550013282713899284609273532223781487419770338416653260109238572639243087280632577902857385265070736208291583497988891353312351322545840742380550393294960815728021248513046077985900158814037534487146730483099151396746751774427787635287611736111679074330407715700153025952858666841328055071403960165321273972935204988906850585454805923440635864200149694398767776539993952528995717480620593326867245714074205285828967234591508039849777840636255379730281105670496110061909219669860172557450779495125345533232776767292561378244884362014224844319802810586344516400297830227894063759083198761120293919537342405893653545157892446163
n = 99075185389443078008327214328328747792385153883836599753096971412377366865826254033534293886034828804219037466246175526347014045811852531994537520303063113985486063022444972761276531422538694915030159420989401280012025249129111871649831185047820236417385693285461420040134313833571949090757635806658958193793
d = wienerAttack(e, n)

这里面的get_pq函数并没有用到,运行结果后发现满足条件的phi有四个值。在尝试带入最后一个phi值时,便可以得到flag的值!
这道题有不严谨的地方在于,在实际的证明过程中,维纳运用的多次近似操作,而事实上,近似的值是会产生影响的,只不过难以证明。这道题能成立的前提在于 p ** 3 和 q ** 3 的值很大,这才让题目符合维纳攻击的特性!ok,证毕,下面附上marddown的证明过程

点击查看代码
winner's attack
$$
phi = (p^3 - 1) * (q^3 - 1) \sim (p*q)^3 = n^3

\\e*d \equiv 1 \mod {phi}

\\e*d = k*phi + 1 
\\\sim e*d = k*phi 

\\e/phi = k/d
\\ \sim e/n^3 = k / d

\\构造一元二次方程,使得两根为q,p
\\x^2 - (p+q)x + pq = 0
\\韦达定理



$$

数论推理
$$
已知phi=(p^3 - 1) * (q^3 - 1),n=pq
\\求p+q

\\phi=(p^3 - 1) * (q^3 - 1)
\\  = {p*q}^3 - (p^3 + q^3) + 1
\\\because (a+b) (a²-ab+b²)=a³+b³
\\\therefore \\= {n}^3 - (p+q)(p^2-p*q+q^2) + 1
\\ = {n}^3 - (p+q)(p^2 + 2pq + q^2 -3pq) + 1
\\ = n^3 - (p+q)[(p+q)^2-3n] + 1
\\ = n^3 - (p+q)^3 + 3n(p+q) +1
\\令 x = p+q
\\ 0 = - x^3 + 3n \times x + 1 + n^3 - phi 

$$

标签:phi,pq,攻击,res,numerator,RSA,维纳,def
From: https://www.cnblogs.com/futihuanhuan/p/18126544

相关文章

  • [LitCTF 2023]家人们!谁懂啊,RSA签到都不会 (初级)
    下载task.py看到内容fromCrypto.Util.numberimport*fromsecretimportflagm=bytes_to_long(flag)p=getPrime(512)q=getPrime(512)e=65537n=p*qc=pow(m,e,n)print(f'p={p}')print(f'q={q}')print(f'c={c}')'......
  • 当网络攻击从“侵入”变成“登入”
    当黑客最常用的攻击手段,从用尽十八般武艺、不可告人的“侵入”,变成凭借有效账户、大摇大摆的“登入”,你会不会觉得不可思议?在2023年,这种情况已经成为常态。IBM监测了130多个国家/地区的超1500亿个安全事件形成的《2024年X-Force威胁情报指数报告》(以下简称《报告》)显示,一场围......
  • #产品说明书:施迈赛AZ16ZVK-ST@SCHMERSAL
    #产品说明书:施迈赛AZ16ZVK-ST@SCHMERSAL#产品说明书:施迈赛AZ16ZVK-ST@SCHMERSAL#产品说明书:施迈赛AZ16ZVK-ST@SCHMERSAL大约二十年了,安全性和生产率都不再是相互排斥的。其次,高度重视现代安全系统的集成到机器当局和机构,从而支持一个自由流动的生产。安全系统制造商提供了一......
  • 相关攻击向量详解:揭示网络安全威胁的本质
    相关攻击向量详解:揭示网络安全威胁的本质引言攻击向量,即攻击者利用系统、应用或网络中存在的漏洞进行入侵的路径和手段。理解并掌握攻击向量,对于防御者来说至关重要,因为它可以帮助我们提前预测、识别并阻止潜在的安全威胁。本文将深入阐述几种常见的攻击向量,包括远程代码......
  • Web应用安全现状(包含Injection、File System Traversal、Broken Access Control攻击介
    目录1、Web应用安全现状1.1Web应用发展历程1.2Web应用安全1、Web应用发展历程早期的WWW网,用户通过Web浏览器,相关信息流仅由服务器向浏览器单向传送。多数站点并不验证用户的合法性,因为根本没有必要这样做;所有用户同等对待,提供同样的信息。如今的万维网与早期的万维网......
  • 防火墙对于网络攻击都有哪些防御措施?
    现如今随着网络技术的快速发展,给人们的生活带来了很多的便利,网络技术也被广泛地应用在各个领域和行业当中,但是在这个过程中也会面临各种网络安全的威胁,给所涉及的企业造成了很大的影响,所以防火墙这一技术,为网络安全构建了完善的防护体系,为网络技术提供了可靠的应用环境。那防......
  • 洛谷题单指南-数学基础问题-P3913 车的攻击
    原题链接:https://www.luogu.com.cn/problem/P3913题意解读:车所在的行、列一共有多个个格子。解题思路:假设3*3的棋盘,有三个车分析得知,三个车覆盖了第1、2两行,第2、3两列,覆盖的格子数用公式计算就是2*3+2*3-2*2=8也就是两行格子数加两列格子数再减去交叉点。因此......
  • 在Linux中,如何检测和防止SQL注入和跨站脚本(XSS)攻击?
    在Linux环境中运行的Web服务器和应用程序可能面临SQL注入和跨站脚本(XSS)攻击的风险。以下是在Linux中检测和防止这两种常见攻击的方法:1.SQL注入攻击的检测与防止:1.检测:审计日志分析:通过分析数据库和Web服务器日志,查找异常的SQL查询模式或错误消息,这些可能是SQL注入攻击的......
  • 在Linux中,如何配置和使用fail2ban来防止暴力攻击?
    fail2ban是一个用于防止暴力攻击(如破解密码尝试)的安全工具,它通过监控系统日志文件来检测异常行为,并在检测到多次失败的登录尝试后,自动采取措施(如暂时或永久地阻止攻击者的IP地址)。1.配置fail2ban安装fail2ban:使用你的Linux发行版的包管理器安装fail2ban。例如,在基于Debian的......
  • 在Linux中,什么是DDoS攻击?如何在Linux中防御DDoS攻击?
    DDoS攻击,即分布式拒绝服务攻击(DistributedDenialofService),是一种网络攻击手段,攻击者通过控制多个系统向目标网络或服务器发送大量请求,以消耗目标系统的资源,导致其无法正常提供服务。1.DDoS攻击的特点分布式:攻击来自多个不同的系统,形成一个“僵尸网络”或“僵尸军团”。拒......