题面

import hashlib
import sympy
from Crypto.Util.number import *flag = 'GWHT{************}'flag1 = flag[:19].encode()
flag2 = flag[19:].encode()
assert(len(flag) == 38)P1 = getPrime(1038)
P2 = sympy.nextprime(P1)
assert(P2 - P1 < 1000)Q1 = getPrime(512)
Q2 = sympy.nextprime(Q1)N1 = P1 * P1 * Q1
N2 = P2 * P2 * Q2E1 = getPrime(1024)
E2 = sympy.nextprime(E1)m1 = bytes_to_long(flag1)
m2 = bytes_to_long(flag2)c1 = pow(m1, E1, N1)
c2 = pow(m2, E2, N2)output = open('secret', 'w')
output.write('N1=' + str(N1) + '\n')
output.write('c1=' + str(c1) + '\n')
output.write('E1=' + str(E1) + '\n')
output.write('N2=' + str(N2) + '\n')
output.write('c2=' + str(c2) + '\n')
output.write('E2=' + str(E2) + '\n')
output.close()

decrypt

首先回顾一下之前的一个rsa中的很著名的攻击方法,低解密指数攻击.
低解密指数攻击用到了连分数.
首先在rsa中有: ed=1 mod phi => ed-1=kphi => e/phi-k/d=1/(dphi)
可以发现当p,q很大时,phi和n是接近的,1/(dphi)很小,说明e/phi 和k/d 很接近,这里phi可以近似看成n.
于是e/n 和k/d 很接近.
当e很大时,通过对e/n进行连分数展开,然后对每一项求其渐进分数,通过遍历渐进分数k/d很有可能就被e/n的众多项渐进分数中的一项所覆盖,假设覆盖它的是k1/d1,那么k1=k ; d1=d.这里可能会有疑问,如果gcd(k,d)!=1 那么对于最简的k1/d1来说是否应该存在t使得tk1=k td1=d 呢? 但其实这里 gcd(k,d)一定为1即k,d一定互质.证明也很简单.前面我们可以得到: ed-kphi=1 对于这么一个式子,在扩展欧几里得里有如果gcd(d,k)!=1 那么该该方程无解.(不互质可以提出一个不为1公因子,除过去左边全是整数而右边却是真分数显然不可能)

对于这一道题:
N1/N2=(p1/p2)2 (q1/q2)
显然我们可以知道的是N1/N2 <p1/p2 ; N1/N2<q1/q2
所以在q1/q2在区间(N1/N2,1)之间.
尝试对N1/N2进行连分数展开并求其各项渐进分数,记为ti/si并验证N1%ti==0是否成立,如果成立,那么return.

import gmpy2
N1=60143104944034567859993561862949071559877219267755259679749062284763163484947626697494729046430386559610613113754453726683312513915610558734802079868190554644983911078936369464590301246394586190666760362763580192139772729890492729488892169933099057105842090125200369295070365451134781912223048179092058016446222199742919885472867511334714233086339832790286482634562102936600597781342756061479024744312357407750731307860842457299116947352106025529309727703385914891200109853084742321655388368371397596144557614128458065859276522963419738435137978069417053712567764148183279165963454266011754149684758060746773409666706463583389316772088889398359242197165140562147489286818190852679930372669254697353483887004105934649944725189954685412228899457155711301864163839538810653626724347
c1=55094296873556883585060020895253176070835143350249581136609315815308788255684072804968957510292559743192424646169207794748893753882418256401223641287546922358162629295622258913168323493447075410872354874300793298956869374606043622559405978242734950156459436487837698668489891733875650048466360950142617732135781244969524095348835624828008115829566644654403962285001724209210887446203934276651265377137788183939798543755386888532680013170540716736656670269251318800501517579803401154996881233025210176293554542024052540093890387437964747460765498713092018160196637928204190194154199389276666685436565665236397481709703644555328705818892269499380797044554054118656321389474821224725533693520856047736578402581854165941599254178019515615183102894716647680969742744705218868455450832
E1=125932919717342481428108392434488550259190856475011752106073050593074410065655587870702051419898088541590032209854048032649625269856337901048406066968337289491951404384300466543616578679539808215698754491076340386697518948419895268049696498272031094236309803803729823608854215226233796069683774155739820423103
N2=60143104944034567859993561862949071559877219267755259679749062284763163484947626697494729046430386559610613113754453726683312513915610558734802079868195633647431732875392121458684331843306730889424418620069322578265236351407591029338519809538995249896905137642342435659572917714183543305243715664380787797562011006398730320980994747939791561885622949912698246701769321430325902912003041678774440704056597862093530981040696872522868921139041247362592257285423948870944137019745161211585845927019259709501237550818918272189606436413992759328318871765171844153527424347985462767028135376552302463861324408178183842139330244906606776359050482977256728910278687996106152971028878653123533559760167711270265171441623056873903669918694259043580017081671349232051870716493557434517579121
c2=39328446140156257571484184713861319722905864197556720730852773059147902283123252767651430278357950872626778348596897711320942449693270603776870301102881405303651558719085454281142395652056217241751656631812580544180434349840236919765433122389116860827593711593732385562328255759509355298662361508611531972386995239908513273236239858854586845849686865360780290350287139092143587037396801704351692736985955152935601987758859759421886670907735120137698039900161327397951758852875291442188850946273771733011504922325622240838288097946309825051094566685479503461938502373520983684296658971700922069426788236476575236189040102848418547634290214175167767431475003216056701094275899211419979340802711684989710130215926526387138538819531199810841475218142606691152928236362534181622201347
E2=125932919717342481428108392434488550259190856475011752106073050593074410065655587870702051419898088541590032209854048032649625269856337901048406066968337289491951404384300466543616578679539808215698754491076340386697518948419895268049696498272031094236309803803729823608854215226233796069683774155739820425393
def continuedFra(x, y):cF = []while y:cF += [x // y]x, y = y, x % yreturn cF
def Simplify(ctnf):numerator = 0denominator = 1for x in ctnf[::-1]:numerator, denominator = denominator, x * denominator + numeratorreturn (numerator, denominator)
def getit(c):cf=[]for i in range(1,len(c)):cf.append(Simplify(c[:i]))return cf
#求渐进分数
def wienerAttack(e, n):cf=continuedFra(e,n)for (p2,p1) in getit(cf):if p1 == 0:continueif N1%p1==0 and p1!=1:return p1print('not find!')
q1=wienerAttack(N1,N2)
#p1=11628371843051760370952910026406764366191062991235308941262037248377376991693250742343307155422036713746576338866595433599862614339347536916226536644210947
print(q1)
p1=gmpy2.iroot(N1//q1,2)[0]
p2=gmpy2.next_prime(p1)
q2=gmpy2.next_prime(q1)
phi1=p1*(p1-1)*(q1-1)
phi2=p2*(p2-1)*(q2-1)
d1=gmpy2.invert(E1,phi1)
d2=gmpy2.invert(E2,phi2)
from Crypto.Util import number
m1=number.long_to_bytes(gmpy2.powmod(c1,d1,N1))
m2=number.long_to_bytes(gmpy2.powmod(c2,d2,N2))
print((m1+m2))#GWHT{3aadab41754799f978669d53e64a3aca}

总结

1,每次拿到一个顺手的脚本或者工具都会让我这个工科生兴奋,但是是其背后的理论知识也十分重要.理论知识往往能解决一类问题,而脚本或者工具往往只能解决一个问题.
2,知识太多需不断学习.

羊城杯 Crypto RRRRRRRSA (连分数,低解密指数攻击原理)相关推荐

  1. RSA密码——Wiener的低解密指数攻击(利用连分数理论)

    RSA密码--Wiener的低解密指数攻击 先描述一下RSA密码体制: RSA密码体制: 大素数p,qp,qp,q,模数n=pqn=pqn=pq,加密指数bbb,解密指数aaa,满足ab≡1(modϕ ...

  2. 低解密指数攻击_CTF中RSA的一些攻击思路

    本文为看雪论坛优秀文章看雪论坛作者ID:丿feng本文简略总结了前人的一些RSA攻击思路,代码或来源于网上或本人原创.并已在GitHub上开源,github地址:https://github.com/ ...

  3. [羊城杯 2020]RRRRRRRSA

    [羊城杯 2020]RRRRRRRSA 题目 import hashlib import sympy from Crypto.Util.number import *flag = 'GWHT{**** ...

  4. Extremely hard RSA 低加密指数攻击

    题目说明 没想到RSA4096都被你给破了,一定是我的问题,给了你太多信息,这次我只给你一个flag的加密值和公钥(Extremely hard RSA),仍然是RSA4096,我就不信你还能解出来. ...

  5. RSA进阶之低加密指数攻击

    适用场景: n很大,4000多位,e很小,e=3 一般来说,e选取65537.但是在RSA加密的时候有可能会选用e=3(不要问为什么,因为选取e =3省时省力,并且他可能觉得n在4000多位是很安全的 ...

  6. BUUCTF rsa2(低密度指数攻击)

    题目: 首先,审计题目,我们可以从中发现我们想要的N和e两个条件,出现hashlib.md5,在rsa中d也称为解密指数,当d比较小的时候,e也就显得特别大了. 适用情况:e过大或过小(一般e过大时使 ...

  7. 【2022羊城杯WriteUp By EDISEC】

    2022羊城杯WriteUp By EDISEC Web little_db Safepop rce_me step_by_step-v3 ComeAndLogin simple_json Misc ...

  8. 基于低加密指数广播攻击(Hastad攻击)的更深一步学习

    低指数加密指数广播攻击 原型介绍: 低指数加密指数广播攻击(Low-Exponent RSA Broadcast Attack)是一种针对低指数RSA加密算法的攻击方法. 例题引入: 下面展示一些 内 ...

  9. 羊城杯2022 部分题解

    羊城杯2022 部分题解 2678.54分39名. 排名不算高,但是比赛过程还是挺有意思的,虽然时好时坏的平台和脑洞题很屑. Crypto有大佬去carry了,这次只搞了Misc,Web辅助坐牢. 签 ...

最新文章

  1. R语言ggplot2可视化:使用ggrepel包在线图(line plot)的尾端那个数据点添加文本标签(text label)
  2. 冇内容管理系统分析-[JS]详尽解析window.event对象
  3. ArcGIS API for JavaScript 4.4学习笔记[新] AJS4.4和AJS3.21新特性
  4. 017.Zabbix宏介绍
  5. 【转】UNITY之LUA加密
  6. 面向对象程序设计 第六次作业
  7. arm nodejs_ARM发布Cortex A78C增强版大核架构
  8. Ubuntu16.04安装使用wineqq
  9. 使用d3.v3插件绘制出svg图
  10. 敏捷开发“松结对编程”实践之二:计划与设计篇(大型研发团队,学习型团队,139团队,师徒制度,设计评审,预想陈述,共同估算,扑克牌估算)...
  11. Android Key Hash的生成
  12. 用C++ Builder对图像进行特殊效果处理
  13. 最新cs1.6服务器ip地址,CS1.6 IP地址大全(死亡奔跑等)
  14. java保留小数点后两位_JAVA中小数点后保留两位的方法有哪些
  15. win7 64位系统安装HP LaserJet 5100 PCL 6
  16. 流量回放专题-jvm-sanbox-repeater
  17. WS以及NW小世界网络的生成(MATLAB)
  18. 迈开职场充电第一步,让我们在这个冬天邂逅社科院杜兰金融管理硕士项目
  19. 高通ISP流程中,ADRC Gain与GTMLTM的对应关系
  20. OpenCV:对图像的位操作bitwise_and(与),bitwise_or(或),bitwise_not(非),bitwise_xor(异或)

热门文章

  1. 牛逼的uniapp+Java微信小程序商城来了
  2. 互联网公司面试——字节跳动算法
  3. 多线程编程:模拟商店对某件商品的进货与销售过程并将相关信息打印出来
  4. 007利用癫痫脑电图数据检测癫痫发作和特征频率的深度卷积神经网络方法-2021
  5. OpenCV实现简单的车牌检测、特征点线检测
  6. 异或校验 java_Java生成异或校验码、和校验码、CRC校验码、补码求和校验码四种校验码及校验码匹配工具类...
  7. oracle lpad rpad函数
  8. Seq2Seq模型PyTorch版本
  9. anacoda下安装TPOT库
  10. 外骨骼机器人(五):步态分析之正常步态