1. 题目
from gmpy2 import next_prime
from random import getrandbits
from libnum import n2s, s2n
from secret import flag
assert len(flag) <= 36
m, p, q = next_prime(s2n(flag)), next_prime(getrandbits(0x120)), next_prime(getrandbits(0x200))
s = m * p % q
print(hex(p))
print(hex(q))
print(hex(s))
如果在使用 Windows 版 PyCharm 解题过程安装 gmpy2 出现问题,可尝试参考 Python 和 PyCharm 安装 gmpy2 出现 ERROR 的解决方法来解决。
2. 解答
from gmpy2 import next_prime
from random import getrandbits
from libnum import n2s, s2n, invmod
def main():
p = 0x49ee5ab58220093a5d3a3602533446e6ec03d7cc5f1b99dfa5a7a1a423cdb134f84a46d1
q = 0x11115dc6324fc3edade1d84c6bd4cff6561550cecdfeca35815d02d3340281ab53f7a33bbe77949f0b6b98b35ddef346b52b359fa719b4b51eff0a52f92b7c5
s = 0xd077b2bd82d807a07685e0777adf8745da78c5474af674ecde5a8094ada1385ce0ce2390763dc37351e6d6c92e520a6a1c34ab1cb1def0454d521ef822f9d9
m = invmod(p, q) * s % q
print(hex(m))
print(int(str(hex(m)), 16))
print(n2s(int(str(hex(m)), 16)))
print(len(n2s(int(str(hex(m)), 16))))
if __name__ == '__main__':
main()
求得 m 之后,直接将其转换为字符串后,可得到长度为 34 的字符串但最后一位乱码,结合 assert len(flag) <= 36 以及 flag 的形式,可对所有可能情况进行尝试。
3. 参考
|