首页 > 其他分享 >Coppersmith定理

Coppersmith定理

时间:2024-10-09 16:46:14浏览次数:1  
标签:coppersmith 定理 print import Coppersmith hint1 ct

原理

用到格基规约和LLL算法。。。

啊?你问那是什么?去搜吧,反正我没看懂。

实现

有一个 e 阶的多项式 f, 那么可以:

  • 在模 n 意义下,快速求出 n^{1/e} 以内的根
  • 给定 β,快速求出模某个 b 意义下较小的根,其中
    b≥​​​n^{\beta },是 n 的因数。

一般采用sage下的small_roots(X=2^kbits,beta=β)。

应用

coppersmith定理应用最多的是高位攻击一类,通过该定理求得剩余二进制位。

限制性:coppersmith定理能求得的位数有限。

一般来说,n=p*q,设p,q均是1024位的大素数,则n的大小为2047bits或2048bits,而n^{0.5}就是大概1024bits的数,与p,q接近,但是不一定满足
p,q≥n^{0.5},所以β一般取0.4,根据大佬们的证明得出,在上述条件下,只要未知二进制位数小于492均可应用coppersmith定理求解。

满足上述要求的情况下,所需要的small_roots()函数中的参数X代表所需求解根的上限,即假设未知的位数是kbits,参数X导入的值就是2^kbits。

 

例题 [BaseCTF 2024]铜匠

附件

from Crypto.Util.number import getPrime, bytes_to_long
#from secret import flag
flag=b'XXXX'

p = getPrime(1024)
q = getPrime(1024)
n = p * q
e = 65537
hint1 = p >> 721
hint2 = q % (2 ** 266)
ct = pow(bytes_to_long(flag), e, n)
print(hint1)
print(hint2)
print(n)
print(ct)
'''
hint1 = 14439249591349619691972392177790365247490839237199085979433418493254022567815148979672690178
hint2 = 90063199151369157959005663017593053931871580139169245885113098598755909124764417
n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461
ct = 15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289
'''

​思路

给了p的高位和q的低位,用逆元算出p的低位,得出p一共已知的位数,中间未知的455位考虑用coppersmith解,如果直接解解不出来,可以尝试抬高位数进行爆破,最后找到flag。幸运的是,这道题可以直接解出来。

exp​​

#sage
hint1 = 14439249591349619691972392177790365247490839237199085979433418493254022567815148979672690178
hint2 = 90063199151369157959005663017593053931871580139169245885113098598755909124764417
n = 18347545778876678838092757800261556931131930866012101566000425608407193858675622059415995283684230959320874387944052648148677918542763633503231962873204645415818139345588988936580526094727943067102768943117592654029397879665312089518191052154267343886226820785206334238961064175118262578895847281575656290248049404047727756356910896332939145136942219317065063060070725033146788186604738271846183709127655298440696824683099637827282095133642324657860714680107691622056420045091586609974536644773286992447027164350612852922016376888380895187804771279035652496676089183636450028327097084911908336202253562671798012457461
ct = 15659576879410368237140555530527974801613150473447768911067611094143466009251385693099110691602954207905029692682380253595062935017486879899242785756448973466690818942065250284891341066578689696180061755610538867770441139827574063212967027249650509215685566103350688284041405586915563454117672061141919712416360596137520514412607512596079964611672166435592936417138352662031529414118312166411150736015788925026636845744110093161894267707446937939130745326244186579516665160036229715964182962542836836457885170975474737620430886449029488829662146456489724775166105816909257516908496172172266375617868819982791477888289
e = 65537
 
p_high = hint1<<721
q_low = hint2
mod = 1<<266
p_low = n*inverse_mod(q_low,mod) % mod
PR.<x> = PolynomialRing(Zmod(n))
 
f = p_high + x*mod + p_low
pp = f.monic().small_roots(X=2^455,beta=0.4)
if pp:
    p=(pp[0]*mod)+p_high+p_low
    
 
from Crypto.Util.number import *
from gmpy2 import *
 
 
q = n//p
phi = (p-1)*(q-1)
d = inverse(e, phi)
m = long_to_bytes(pow(ct, d, n))
print(m)

 

标签:coppersmith,定理,print,import,Coppersmith,hint1,ct
From: https://www.cnblogs.com/snoozy/p/18454604

相关文章

  • 威尔逊定理
    初识威尔逊定理什么是威尔逊定理,即对于一个质数p来说,有(p-1)!≡-1(modp)恒成立,其逆定理也成立,即对于一个数p来说若满足上式,则p一定是素数。于是通过这个性质我们能够得到素数分布的函数:f(n)=sin(π*((n-1)!+1)/n)当函数值为0时,对应n就是一个素数,但好像没用(确信。推......
  • 威尔逊定理
    测试一下\[(A−1)!≡ −1 mod A\]其中A为素数1.从代码中可以知道:p=(B1!)%A1p=(B1!)%A1q=(B2!)%A2q=(B2!)%A22.又由[威尔逊定理](A−1)!≡ −1 mod3.而B=A-random.randint(1e3,1e5),所以在B的前面补上(A−1)(A−2)(A−3)...(B+1)就有(A−1)(A−2)(A−3).......
  • 快乐数学2勾股定理0000000
    2勾股定理在任意一个直角三角形中,两条直角边的平方和等于斜边的平方。a²+b²=c²a和b分别表示直角三角形的两条直角边长度。c表示斜边长度。我们大多数人都认为这个公式只适用于三角形和几何图形。勾股定理可用于任何形状,也可用于任何将数字平方的公式。2.1了......
  • 二项式定理来源
    这是国庆作业。很巧的是我的二项式定理学习笔记正好是去年国庆时写的。因为是发视频作业,所以这算是稿子。在中国,成书于1世纪的《九章算术》提出了世界上最早的多位正整数开平方、开立方的一般程序。11世纪中叶,贾宪在其《释锁算书》中给出了“开方作法本原图”,满足了三次以上开......
  • 行列式求法和矩阵树定理
    1.矩阵树定理无向图,有n个点,如果说i-j之间有连边,那么矩阵g[i][j]=g[j][i]=-1(i-j之间的边的数量),否则值为0矩阵上对角线上的值为该点的度数,g[i][i]=d[i];生成树个数:任选i,去掉i行i列之后的行列式的值生成树的权值=边权的乘积,所有生成树的权值之和?i-j之间右边,g[i][j]=......
  • 介值定理
    什么是介值定理?介值定理(IntermediateValueTheorem,简称IVT)是微积分中的一个基本定理。简单来说,介值定理告诉我们,如果一个函数在一个区间上是连续的,那么这个函数会“覆盖”该区间内所有介于其端点函数值之间的值。定理的正式表述:如果函数$f$在闭区间\([a,b]\)上连续,且$......
  • 算术基本定理
    一个整数可以被表示成若干质数的乘积。例如:\(48=2^4\times3,\49=7^2,\50=2\times5^2\)。算术基本定理:设\(a>1\),那么必有\(a=p_1^{\alpha_1}p_2^{\alpha_2}\cdotsp_s^{\alpha_s}\),其中\(p_i\(1\lei\les)\)是两两不相同的质数,\(\alpha_i\(1\lei\le......
  • 费马大定理在n等于4时成立的证明
    1.费马大定理内容大约在1637年左右,法国学者费马在阅读丢番图(Diophatus)《算术》拉丁文译本时,曾在第11卷第8命题旁写道:“将一个立方数分成两个立方数之和,或一个四次幂分成两个四次幂之和,或者一般地将一个高于二次的幂分成两个同次幂之和,这是不可能的。关于此,我确信已发现了一种美妙......
  • 中国剩余定理(一次同余问题) Java
    /***中国剩余定理*/publicclassChineseRemainderTheorem{//扩展欧几里得算法,返回gcd(a,b)以及x,y使得ax+by=gcd(a,b)publicstaticintextendedGCD(inta,intb,int[]xy){if(b==0){xy[0]=1;xy[1]......
  • 信息安全数学基础(20)中国剩余定理
    前言    信息安全数学基础中的中国剩余定理(ChineseRemainderTheorem,简称CRT),又称孙子定理,是数论中一个重要的定理,主要用于求解一次同余式组。一、背景与起源    中国剩余定理最早见于我国南北朝时期的数学著作《孙子算经》中的“物不知数”问题。该问题可......