慢慢更新
我发现,在做crypto ctf的过程中,能学到好多有趣的知识,也能学到好多sagemath的新姿势~
Titu
from Crypto.Util.number import *
from flag import flag
l = len(flag)
m_1, m_2 = flag[: l // 2], flag[l // 2:]
x, y = bytes_to_long(m_1), bytes_to_long(m_2)
k = '''
000bfdc32162934ad6a054b4b3db8578674e27a165113f8ed018cbe9112
4fbd63144ab6923d107eee2bc0712fcbdb50d96fdf04dd1ba1b69cb1efe
71af7ca08ddc7cc2d3dfb9080ae56861d952e8d5ec0ba0d3dfdf2d12764
'''.replace('\n', '')
assert((x**2 + 1)*(y**2 + 1) - 2*(x - y)*(x*y - 1) == 4*(int(k, 16) + x*y))
题目给了一个等式。
我们在sagemath上对k进行分解,发现k是一个完全平方数
根据等式,我们把4xy移到左边,对这个式子进行分解,发现
该式也是一个完全平方公式
对两边开方,构造等式:
(
m
1
+
1
)
∗
(
m
2
−
1
)
=
2
k
(m1+1)*(m2-1)=2\sqrt{k}
(m1+1)∗(m2−1)=2k
我们只要找到
2
k
2\sqrt{k}
2k的两个满足条件的因子即可
sagemath中divisors(k)函数可以快速找到k的所有因子。
from Crypto.Util.number import *
k="""000bfdc32162934ad6a054b4b3db8578674e27a165113f8ed018cbe9112
4fbd63144ab6923d107eee2bc0712fcbdb50d96fdf04dd1ba1b69cb1efe
71af7ca08ddc7cc2d3dfb9080ae56861d952e8d5ec0ba0d3dfdf2d12764""".replace("\n","")
k=int(k,16)
k=2*sqrt(k)
divisors_k=divisors(int(k))
for m in divisors_k:
m1=long_to_bytes(int(m-1))
if b"CCTF" in m1:
m2=long_to_bytes(int((k/m)+1))
flag=m1+m2
print(flag)
break