cryptocont23/3번문제-DONE/main.py

37 lines
1.2 KiB
Python

import json
C = 374015834710561043810344051134135
n = 98639350158287747956171614024858003106737929785723376047985588489903225031675238942280563373940905701931651170379361219551278894213021434648783114473246721338107200738833103695814346217200966617698677137725683746838186561756004241774294434212453862492176950276330700287348945941127494562176214125995218765677
M = 8684345636908686698383058753930515845376216074491905095625386038921316376845905096948974184280037158397773209920391529649784574906985754450477350014610356222003127212466169135522169279492231954962510144676909892095883819057606351964935618910468692572435658048566378696492965708241737271579660195263078472751
with open("k_pair.json", "r") as j:
k_pair = json.loads(j.read())
# print(len(k_pair))
# print(k_pair[0])
k_pair.reverse()
k_pair.append([0, M])
key = 0
for it, q in enumerate(k_pair):
k, m_k = q
# (C^(d_k * 2^k) ≡ x_k mod n
print(it, k)
for i in range(key + 0, key + 2**(1024-k)-1):
m_ik = pow(pow(C, i, mod = n), pow(2, k), mod=n)
if m_ik == m_k:
print(i, m_k)
key = i
break
if m_ik != m_k:
print("E")
if it == 160:
print(key)
break
key = key << (k - k_pair[it+1][0])
print(pow(C, key, mod=n) == M)
print(key)