新题目记录一下
#######################
# @Author: Lazzaro
#######################
from secret import flag
print(int(str(int.from_bytes(str(flag).encode(), byteorder='little') << 10000)[-175:]))
#5390734306631855467986187436983737752151008395372308788862499432056740530367025683371238030400935613581745610066222336578420939008918998541409247659187704647583389480103444480
传说中的一句话加密,本质上就是将flag转数字,然后左移10000bit,即乘上2*10000,然后打印出最后175位的数值。
即
c
=
2
10000
×
m
m
o
d
1
0
175
c = 2^{10000} \times m \mod 10^{175}
c=210000×mmod10175
于是
m
=
2
−
10000
×
c
m
o
d
1
0
175
m = 2^{-10000} \times c \mod 10^{175}
m=2−10000×cmod10175,
又因为
g
c
d
(
2
10000
,
1
0
175
)
=
2
175
gcd(2^{10000},10^{175})=2^{175}
gcd(210000,10175)=2175,所以需要先约分再求逆
c
×
2
−
175
=
2
10000
−
175
×
m
m
o
d
5
175
c \times 2^{-175} = 2^{10000-175} \times m \mod 5^{175}
c×2−175=210000−175×mmod5175
即
m
=
2
−
10000
+
175
−
175
×
c
m
o
d
5
175
m = 2^{-10000+175-175} \times c \mod 5^{175}
m=2−10000+175−175×cmod5175
最终exp:
from gmpy2 import *
from Crypto.Util.number import *
c = 5390734306631855467986187436983737752151008395372308788862499432056740530367025683371238030400935613581745610066222336578420939008918998541409247659187704647583389480103444480
x = invert(pow(2,10000),pow(5,175))
m = c*x%(pow(5,175))
print(long_to_bytes(m)[::-1])