引言
还有一个月就要期末考了,摸了摸了(
周末还要组织校赛,考四级口语,事情老多了
BASE
题目给了一个 22.8MB 的 txt 文件,里面都是数字和大写字母
看着好像就是普通的十六进制啊
结果尝试直接转十进制看看有没有头绪, 结果程序半天不出结果。。。
看着也不像 base64 啊
找 wp(
直接暴力尝试 base16,base32,base64。。。
代码如下:
import base64
file = open("flag_encode.txt",'r')
file2 = open("flag",'w')
base = file.read()
while(1):
try:
base = base64.b32decode(base).decode()
except:
try:
base = base64.b64decode(base).decode()
except:
try:
base = base64.b16decode(base).decode()
except:
print("解码完毕qwq!")
file2.write(base)
break
结果为:afctf{U_5h0u1d_Us3_T00l5}
EzRSA
加密代码如下:
from gmpy2 import lcm , powmod
from Crypto.Util.number import getPrime
p = getPrime(1024)
q = getPrime(1024)
n = p * q
gift = lcm(p - 1 , q - 1)
e = 54722
flag = b'NPUCTF{******************}'
m = int.from_bytes(flag , 'big')
c = powmod(m , e , n)
print('n: ' , n)
print('gift: ' , gift)
print('c: ' , c)
#n: 17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121
#gift: 2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104
#c: 3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319
题目给了 lcm(p - 1 , q - 1)
(
p
−
1
p-1
p−1 和
q
−
1
q-1
q−1 的最小公倍数),又因为
l
c
m
(
p
−
1
,
q
−
1
)
=
(
p
−
1
)
∗
(
q
−
1
)
g
c
d
(
p
−
1
,
q
−
1
)
lcm(p-1,q-1) = \frac{(p-1)*(q-1)}{gcd(p-1,q-1)}
lcm(p−1,q−1)=gcd(p−1,q−1)(p−1)∗(q−1)
所以
φ
=
(
p
−
1
)
∗
(
q
−
1
)
=
g
c
d
(
p
−
1
,
q
−
1
)
∗
l
c
m
(
p
−
1
,
q
−
1
)
\varphi = (p-1)*(q-1) = gcd(p-1,q-1) * lcm(p-1,q-1)
φ=(p−1)∗(q−1)=gcd(p−1,q−1)∗lcm(p−1,q−1)
又因为
n
=
p
∗
q
n=p*q
n=p∗q ,
p
,
q
p, q
p,q 均为大质数,所以有
n
≈
φ
n\approx \varphi
n≈φ
故
g
c
d
(
p
−
1
,
q
−
1
)
≈
n
l
c
m
(
p
−
1
,
q
−
1
)
=
n
g
i
f
t
gcd(p-1,q-1)\approx \frac{n}{lcm(p-1,q-1)} = \frac{n}{gift}
gcd(p−1,q−1)≈lcm(p−1,q−1)n=giftn
代码如下:
n = 17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121
gift = 2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104
c = 3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319
e = 54722
print(n//gift)
得到结果
g
c
d
(
p
−
1
,
q
−
1
)
≈
8
gcd(p-1,q-1)\approx 8
gcd(p−1,q−1)≈8
另一个奇怪的地方就是
e
=
54722
e = 54722
e=54722 与
φ
\varphi
φ 不互质,与原来的 RSA 加密算法不同
我们令
e
′
=
e
/
/
2
e'=e//2
e′=e//2 因为
e
′
e'
e′与
φ
\varphi
φ互质
所以有
e
∗
d
≡
1
m
o
d
φ
e*d \equiv 1 \space mod \space \varphi
e∗d≡1 mod φ
故有
d
′
=
2
∗
d
s
.
t
.
e
′
∗
d
′
=
e
∗
d
≡
1
m
o
d
n
d'=2*d\space s.t.\space e'*d' = e*d \equiv 1 \space mod \space n
d′=2∗d s.t. e′∗d′=e∗d≡1 mod n
而
m
′
≡
c
d
′
m
o
d
n
=
c
2
d
m
o
d
n
m' \equiv c^{d'} \space mod \space n = c^{2d} \space mod \space n
m′≡cd′ mod n=c2d mod n
所以
m
≡
m
′
m
o
d
n
m \equiv \sqrt{m'} \space mod \space n
m≡m′
mod n
完整代码如下:
from Crypto.Util.number import *
from gmpy2 import gcd, iroot
n = 17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121
gift = 2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104
c = 3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319
e = 54722
phi = gift * (n//gift)
e = e//2
d = inverse(e, phi)
m = pow(c, d, n)
m = iroot(m, 2)[0]
print(long_to_bytes(m))
结果为:NPUCTF{diff1cult_rsa_1s_e@sy}
结语
不知不觉这个学期算上今天已经更了 47 篇了
总算把前三面刷完了,快要把 1 分题刷穿了
这学期就到这了
希望继续坚持吧