当前位置:首页 > CTF > 攻防世界 > 正文内容

XCTF_crypto进阶区_cr3-what-is-this-encryption

七星4年前 (2020-08-16)攻防世界3066

image.png


明显的RSA.把十六进制转二进制数字:

image.png

image.png

已知p,q,e和密文c,求明文.

参考第八题,RSA算法详解:

https://qixingbit.com/xctf/%E5%AF%86%E7%A0%81%E5%AD%A6/

直接上工具:求出公钥和私钥:

# -*-coding=utf -*-
# RSA密钥生成

def exgcd(e,fn):
    if fn==0:
        return 1,0
    else:
        x,y = exgcd(fn,e%fn)
        x,y = y,x-(e//fn)*y
        return x,y

def getReverse(e,fn):
    re,y = exgcd(e,fn)
    while re<0:
        re += fn
    return re

if __name__ == "__main__":
    p = 8695224115036335558506571119739296036271134788610181138168484331081777972517240308721981280176995392696427341397469232176120700610749965333026113898553049
    q = 13096749823995628078930936161926731366955083380107539950861609990671457149850288846976369982960384583841424977220385144435351119887497145134804975486079751 # 选择两个大素数p,q
    n = p * q
    fn= (p-1) * (q-1)  # 计算小于n并且与n互质的整数的个数,即欧拉函数f(n)=(p-1)(q-1)
    e = 76629781387397242664311670987431757827144139255639280752983416867031015307352014386648673994217913815581782186636488159185965227449303118783362862435899486717504457233649829563176353949817149997773276435581910370559594639570436120596211148973227077565739467641309426944529006537681147498322988959979899800641   # 选择一个随机数e满足1<e<f(n),并且e和放f(n)互质,即gcd(e,f(n))=1//最大公约数是1
    d = getReverse(e,fn)    # 辗转相除法(扩展的欧几里得算法)获取d
    
    PU = [e,n] # 生成公钥
    PR = [d,n] # 生成私钥
    
    print("公钥:",PU,"\n私钥:",PR)


image.png

然后分别用私钥和公钥解密c:

# -*-coding=utf -*-
# RSA解密

def decrypt(PR,crypto):  # 解密
    a = 1     #存放c的PR[0]次方
    for i in range(PR[0]):
        a *= crypto
    mess = a % PU[1]     # 解密算法:明文=密文的(私钥e次幂)与公钥的n取余.
    return mess      # RSA私钥解密后的值

if __name__ == "__main__":
    # 公钥
    PU = [76629781387397242664311670987431757827144139255639280752983416867031015307352014386648673994217913815581782186636488159185965227449303118783362862435899486717504457233649829563176353949817149997773276435581910370559594639570436120596211148973227077565739467641309426944529006537681147498322988959979899800641, 113879174898204668645967117693806176653947255938239415762484178439933029039942480992378962821742116042132121384130894271263769392129728556897504506961994039747096980003544238879691641682840243016660565002199580402158485888797811110890373870112239180679080062627348028514800765210824649322666826925080318210799]
    
    #私钥
    PR = [18936883706566089565183982761163360067838840777445463846869386030950038236998435836714296866300418740544099110893204385625543094093735175505576482105219020550596925375537703816973971295423941261736768673779496969415318449125906497680286964409673665181523565837769494950681114099888754750396643258941215566961, 113879174898204668645967117693806176653947255938239415762484178439933029039942480992378962821742116042132121384130894271263769392129728556897504506961994039747096980003544238879691641682840243016660565002199580402158485888797811110890373870112239180679080062627348028514800765210824649322666826925080318210799]
    
    # 密文
    c = 89801389443569569957398406954707598492763923418568536030323546088278758362331043119736437910117697032594835902900582040394367480829800897231925233807745278389358031404278064633313626149336724945854865041439061149411962509247624419448003604874406282213609341704339025169015256228029200222643343430028828063008

    print(decrypt(PR,c))
    print(decrypt(PU,c))


然后就,等吧.


还有更快的, 调用强大的数学运算库去做:

# -*-coding=utf -*-
# RSA解密

import libnum
from Crypto.Util.number import long_to_bytes

c = 0x7fe1a4f743675d1987d25d38111fae0f78bbea6852cba5beda47db76d119a3efe24cb04b9449f53becd43b0b46e269826a983f832abb53b7a7e24a43ad15378344ed5c20f51e268186d24c76050c1e73647523bd5f91d9b6ad3e86bbf9126588b1dee21e6997372e36c3e74284734748891829665086e0dc523ed23c386bb520
e = int("0x6d1fdab4ce3217b3fc32c9ed480a31d067fd57d93a9ab52b472dc393ab7852fbcb11abbebfd6aaae8032db1316dc22d3f7c3d631e24df13ef23d3b381a1c3e04abcc745d402ee3a031ac2718fae63b240837b4f657f29ca4702da9af22a3a019d68904a969ddb01bcf941df70af042f4fae5cbeb9c2151b324f387e525094c41",16)
q = int("0xa6055ec186de51800ddd6fcbf0192384ff42d707a55f57af4fcfb0d1dc7bd97055e8275cd4b78ec63c5d592f567c66393a061324aa2e6a8d8fc2a910cbee1ed9",16)
p = int("0xfa0f9463ea0a93b929c099320d31c277e0b0dbc65b189ed76124f5a1218f5d91fd0102a4c8de11f28be5e4d0ae91ab319f4537e97ed74bc663e972a4a9119307",16)
n = q*p
d = libnum.invmod(e, (p - 1) * (q - 1))

m = long_to_bytes(pow(c, d, n))

print(m)


image.png



七星比特|qixingbit.com

相关文章

XCTF_web进阶区_bug

XCTF_web进阶区_bug

不小心点了一下,发现进去了,只能硬着头皮做了。开始可以看见是一个登录界面这个题也不是SQL注入的题,于是正常的注册,登录    正常的访问了主界面,但是,访问m...

XCTF_web进阶区_Training-WWW-Robots

XCTF_web进阶区_Training-WWW-Robots

开题,创建场景:其实根据题目名称,可以猜到是考robots的,但还是看一下他说了啥:直接访问/robots.txt然后出现了flag文件,访问获得flag:...

XCTF_pwn新手区_guess-num

XCTF_pwn新手区_guess-num

下载题目,ida查看main函数伪代码:这里可以看出,v8是个随机数.而这个v6就是我们需要输入的猜测数分析这个代码,逻辑是这样的:先输入name,然后进入for循环,生成随机数,然后要求输入随机数,...

XCTF_crypto进阶区_工业协议分析1

XCTF_crypto进阶区_工业协议分析1

讲真的,这道题,完全没有看出密码在哪里.拿到流量包,过滤字符串:我找了很久很久, 因为很多流量里面都有这个flag.txt, 但是就是不知道这个txt在哪里.于是换个思路,有没有png或者zip之类的...

XCTF_crypto进阶区_你猜猜

XCTF_crypto进阶区_你猜猜

拿到题:根据做misc的经验,他是一个文件,看文件头:504B0304就知道是个zip.丢到hex里面提取出来:加密的.所以是真加密.然后, 爆破呗.一般爆破题纯数字.工具可以百度.直接出flag...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。