0ne_piece(一道简单的RSA) WP

0ne_piece WP

之前没怎么搞过Crypto,因为校赛缺题捣鼓了一道RSA,只是在基础的RSA上绕了一点东西,问题不大,所以叫一道简单的RSA

题目文件
第二个压缩包发现打开此压缩包需要密钥
D(d)
打开D(d)文件,这是一道简单的RSA,已知p,q,e求d。Monkey. .Luffy(就是没有D(d))大概就是这个意思,通过D(d)解出d即为压缩包的密钥。
点开RSATool(懒狗实锤)
RSATool
由题目已知,p=473398607161,q=4511491,e=1080923,那必然e是十进制,在使用RSATool时记得e是十六进制。
Get d
或者没有RSATool我们python来解决

p=473398607161
q=4511491
e=1080923
def egcd(a,b):
    if a==0:
        return (b,0,1)
    else:
        g,y,x=egcd(b%a,a)
        return(g,x-(b//a)*y,y)
def modinv(a,m):
    g,x,y=egcd(a,m)
    if g!=1:
        raise Exception("no")
    else:
        return x%m
d=modinv(e,(p-1)*(q-1))
print(d)

得到d,然后打开压缩包
内置文件发现运行不起,诶,怎么可能让你运行的起
编译器打开文件:
python文件
原代码:

import gmpy2
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex

flag = "*****************"

p = 262248800182277040650192055439906580479
q = 262854994239322828547925595487519915551

e = 75533
n = p*q


c = pow(int(b2a_hex(flag),16),e,n)

print c

#27565231154623519221597938803435789010285480123476977081867877272451638645710

flag=m-z

#z=Y\xea\xfc\xd79\x81\x05\xe3|\x95\xf6\x88\xc9\xea\xab\r\xce1\x00\xf7\xc1`F\xfd\xcb\tI\xcd\xdaE`\x14

这道题的意思是,已知p,q,e,n,c,算出的m即为明文,然后m再减去z,但是

#z=Y\xea\xfc\xd79\x81\x05\xe3|\x95\xf6\x88\xc9\xea\xab\r\xce1\x00\xf7\xc1`F\xfd\xcb\tI\xcd\xdaE`\x14

这又是什么意思呢
啊 一看题目,提示的很清楚,是Bytes_to_long,百度一下就会知道其大概意思,举个栗子:

print(Bytes_to_long(b"a"))
print(Bytes_to_long(b"ab"))
print(Bytes_to_long(b"abc"))
-------------------------------------------------
97
24930
6382179

为什么是这样的结果呢?


大家可以看看这个

下面就来解m

解题脚本放在下面就不细说了

import gmpy2
import libnum
from Crypto.Util.number import *
#from binascii import a2b_hex,b2a_hex

flag = "*****************"   #flag为m+z

p = 262248800182277040650192055439906580479
q = 262854994239322828547925595487519915551

e = 75533  
n = p*q

d = gmpy2.invert(e,(p-1)*(q-1))   # 求逆元,de = 1 mod (p-1)*(q-1)
print(d)
#c = pow(int(b2a_hex(flag),16),e,n)


#print c

c = 27565231154623519221597938803435789010285480123476977081867877272451638645710
# c = m^e % n
# m = c^d % n
m = pow(c,d,n) #c^d mod n
#flag=m-z
print(m)
print(bytes_to_long(b"Y\xea\xfc\xd79\x81\x05\xe3|\x95\xf6\x88\xc9\xea\xab\r\xce1\x00\xf7\xc1`F\xfd\xcb\tI\xcd\xdaE`\x14"))
flag=m-40671030779592652767538849805601085084725071519627072653692382716311988690964
print(flag)
print(long_to_bytes(540582659240872519030060664565507593744197449834418706814759970656249725))

# 540582659240872519030060664565507593744197449834418706814759970656249725
# b'NSSCTF{B1ng0_y0u_g0t_The_F14g}'

意思是要get flag需要知道RSA的本质,只会用RSA工具或者在线解密是肯定不行的。感觉RSA就是在用出题者的阳寿换做题者的阳寿,芜湖。

//来自我的CSDN

posted @ 2021-06-29 22:40  dotExp  阅读(143)  评论(0编辑  收藏  举报