0ne_piece(一道简单的RSA) WP
0ne_piece WP
之前没怎么搞过Crypto,因为校赛缺题捣鼓了一道RSA,只是在基础的RSA上绕了一点东西,问题不大,所以叫一道简单的RSA
第二个压缩包发现打开此压缩包需要密钥
打开D(d)文件,这是一道简单的RSA,已知p,q,e求d。Monkey. .Luffy(就是没有D(d))大概就是这个意思,通过D(d)解出d即为压缩包的密钥。
点开RSATool(懒狗实锤)
由题目已知,p=473398607161,q=4511491,e=1080923,那必然e是十进制,在使用RSATool时记得e是十六进制。
或者没有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,然后打开压缩包
发现运行不起,诶,怎么可能让你运行的起
编译器打开文件:
原代码:
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