1.题目:
import os
from Crypto.Util import number
with open('../secret/flag', 'rb') as f:
flag = f.read()
assert(len(flag) < 200)
p = number.getPrime(1024)
q = number.getPrime(1024)
n = p * q
e = 65537
data = number.bytes_to_long("JDSE")
flag = number.bytes_to_long(os.urandom(255-len(flag)) + flag)
with open('output.txt', 'w') as f:
print(n, file=f)
print(pow(flag, e, n), file=f)
print(pow(data, p, n), file=f)
n=16190071651163806295864019410478994111033069033627784225762863537603051286100205075670533295885064417368900028860200646693729094397336259104108103548185993908365388380839285172911963120514072321190266876940732034732397117137061394460746923843922245782775468266708629538795929791940224005947023797710889884139262655896037569495345277362100989310206818815906815037340109507090191392200724993896961774561625607045531746223966956306007588691156861073213545675831176519130019553724245771994149735589727939984664508149900746138671733567269193055682039733308565608623124419978622690108399287267782094992833491412117540060443
c=15303419998661114679314254717914026405478757825416735351601804954118839229797070479526681279224742375492655311505697019190557550696467480133256967636550925789855469334208787745973414205031434095712965892662629942032090010088494752811463912882633957119964067548777662273186260137022598527046219193475032906299912859488699286089311234866062127452250073707233182744079405190900962311612847001444141191413026226164120884637043140094140783528285331931332316785677352225990586242903100117563104312764791553556755518103356463537538508315396815826486784213208395270070213346386705111244580124327114520898478012805359398827670
c1=1510184595792565064445440906881935995266619097536001461530783965780154369249043641074486895520464486085479962000078556210579654456510298579647913754227118673129421819393900310384823524058038067616709691791898230083313217906194886078501873907639225319148093330535005464365092684845804210054017334558737467574892102337630443813828900547064330664128905647113707379303375108854244133403877761359312330320014228059025076059037200823315174250296513866303939391915733284159144473793081857745772615093108270863280285078431940816859845225827381322898005915615672862823461308519156692000709906390303017977729854164511610194054
2.分析:flag需要先求d,由于d=gmpy2.invert(e,phi),所以需要知道p和q。p通过data来求解
推导过程:
已知c1=pow(data, p, n)
=data^p%n
所以 data^p=c1+kn
c1=data^p-kn
=data^p-k*p*q #两边同时模p
c1%p=data^p%p #根据费马小定理:a^p ≡a (mod p)
=data%p
kp=data-c1
n=p*q #都存在公约数p可以用欧几里得算法求解
p=gmpy2.gcd(data-c1,n)
3.脚本:
import os
from Crypto.Util.number import *
import gmpy2
import libnum
n = 16190071651163806295864019410478994111033069033627784225762863537603051286100205075670533295885064417368900028860200646693729094397336259104108103548185993908365388380839285172911963120514072321190266876940732034732397117137061394460746923843922245782775468266708629538795929791940224005947023797710889884139262655896037569495345277362100989310206818815906815037340109507090191392200724993896961774561625607045531746223966956306007588691156861073213545675831176519130019553724245771994149735589727939984664508149900746138671733567269193055682039733308565608623124419978622690108399287267782094992833491412117540060443
c = 15303419998661114679314254717914026405478757825416735351601804954118839229797070479526681279224742375492655311505697019190557550696467480133256967636550925789855469334208787745973414205031434095712965892662629942032090010088494752811463912882633957119964067548777662273186260137022598527046219193475032906299912859488699286089311234866062127452250073707233182744079405190900962311612847001444141191413026226164120884637043140094140783528285331931332316785677352225990586242903100117563104312764791553556755518103356463537538508315396815826486784213208395270070213346386705111244580124327114520898478012805359398827670
c1 = 1510184595792565064445440906881935995266619097536001461530783965780154369249043641074486895520464486085479962000078556210579654456510298579647913754227118673129421819393900310384823524058038067616709691791898230083313217906194886078501873907639225319148093330535005464365092684845804210054017334558737467574892102337630443813828900547064330664128905647113707379303375108854244133403877761359312330320014228059025076059037200823315174250296513866303939391915733284159144473793081857745772615093108270863280285078431940816859845225827381322898005915615672862823461308519156692000709906390303017977729854164511610194054
e = 65537
data = bytes_to_long(b'JDSE') #字符串转换
print(data)
p=gmpy2.gcd(data-c1,n)
q=n//p
n=p*q
phi=(p-1)*(q-1)
d=gmpy2.invert(e,phi)
flag=pow(c,d,n)
print(long_to_bytes(flag))