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进制转文本

 

RSA dp泄露的数学原理

答案:

flag{wow_leaking_dp_breaks_rsa?_98924743502}

 

 

总结:RSA类型题目真的难,做不下去了

 

 

posted @ 2021-08-13 17:13  QIONGKE  阅读(118)  评论(1编辑  收藏  举报