2021.8.13CTF刷题
同余符号 ≡ :
性质:
等等。
欧拉定理:
原理:
注意:n,a互素(互质),
1 ( mod a ) = 1; ( a为任意正整数 )
符号 的意义:
整除
一:
题目:RSA1
dp ≡ d mod (p−1)
dq ≡ d mod (q−1)
一切不思考的抄代码,都是耍流氓,点击这篇文章,去解读dp,dq
代码:
p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852 import gmpy2 I = gmpy2.invert(q,p) mp = pow(c,dp,p) mq = pow(c,dq,q) #求幂取模运算 m = (((mp-mq)*I)%p)*q+mq #求明文公式 print(hex(m)) #转为十六进制
pycharm模块gmpy2的安装:
进行大数计算用Python自带的运算和函数已经无法满足要求,gmpy2包可以进行大数运算
在pycharm编译器中用Python Interpreter安装gmpy2包时总会出现各种莫名其妙的Error,网上这方面的教程和博客都很少,之前还以为是pip和setuptools的版本问题,各种重装之后还是安装失败(砸电脑预警。。。)
后来放弃通过pycharm安装这个包,通过轮子直接在系统中安装gmpy2包,然后让pycharm读取本地包,写一下过程防止以后忘记了
在Windows上安装需要非官方的预编译二进制文件,需要从下面这个网站上下载
网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
打开网站后往下翻,找到GMPY,选择适合自己版本的gmpy2的whl文件进行下载,我下载的是
之后打开cmd,输入pip install + 文件名 进行安装
答案:
noxCTF{W31c0m3_70_Ch1n470wn}
二:
题目:
RSA2
代码:
import gmpy2 as gp e = 65537 n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113 dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657 c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751 for i in range(1,e): #在范围(1,e)之间进行遍历 if(dp*e-1)%i == 0: if n%(((dp*e-1)//i)+1) == 0: #存在p,使得n能被p整除 p=((dp*e-1)//i)+1 q=n//(((dp*e-1)//i)+1) phi=(q-1)*(p-1) #欧拉定理 d=gp.invert(e,phi) #求模逆 m=pow(c,d,n) #快速求幂取模运算 print(m) #10进制明文 print('------------') print(hex(m)[2:]) #16进制明文 print('------------') print(bytes.fromhex(hex(m)[2:])) #16进制转文本
答案:
flag{wow_leaking_dp_breaks_rsa?_98924743502}
总结:RSA类型题目真的难,做不下去了