defsolve_pell(D): # 连分数展开 m = 0 d = 1 a0 = int(D**0.5) a = a0 m_list, d_list, a_list = [], [], [a0] whileTrue: m = d * a - m d = (D - m*m) // d a = (a0 + m) // d # 检查是否开始循环 if (m, d, a) inzip(m_list, d_list, a_list): break m_list.append(m) d_list.append(d) a_list.append(a)
h_list = [a_list[0], a_list[0]*a_list[1] + 1] k_list = [1, a_list[1]] for i inrange(2, len(a_list)): h = a_list[i] * h_list[i-1] + h_list[i-2] k = a_list[i] * k_list[i-1] + k_list[i-2] h_list.append(h) k_list.append(k) if h*h - D*k*k == 1: return h, k return h_list[-1], k_list[-1]
from Crypto.Util.number import * from gmpy2 import * import random from secret import flag, hint
defrsa_hint(hint): p = getPrime(1024) q = getPrime(1024) n = p * q e = 0x10001 a = (p >> 256) << 256 c = powmod(bytes_to_long(hint), e, n) print('a =', hex(a)) print('n =', hex(n)) print('c =', hex(c))
rsa_hint(hint)
# a = 0xb0ee0627166579753f354ced7cdb6701a5ebbfaec3cd6af76decc33f95a765bd7e5f758e2076c42a76f5af867152757b97242034693f309973ffdebe4a5ce3dd822260dfa8a8d51f9aac7550474a3a4fe37ecea6cdc23b0cbba5aa6d0d93e9b10000000000000000000000000000000000000000000000000000000000000000 # n = 0x6b9f0bf43d3e9b3278d52b3cfaafadf9449048f8297fedf8f8909a030156a23c68552b5379adbf32fd9584aa42f694c8227d275f40391c7872400eda97c2b79f8349af6492c7b6ac12bae303cee1eb9b6059e5891a6535ca8310e9ba145b7b4d403d8e666e5a55a94e5f7dabe22b80032e936233d7a1f0e96b95aeb4249b8ea34ef8bf422ce9f725844478ee15b739dd70cc6e2c0bd0cb24d7d14baf66c5aca2023c24339d3b90eecb0e2568c148d438a5ce84270ce11159e3aa4d48ac8b2185c2fe8cb328e8f80602c9d7ae49799538154d325700349bb7cd2fb694fb9f8cbcf2ebced8f6c29a05c64aa78a036416c28e6e7b937a371c98feed2d826ca9ed63 # c = 0x4dba2f194b97d4dac89548c035bf18d708fb9edfd6b7706e6d7871c6129931cde88718bdcbd1e8410f1e7a4c709bdf9d31572ee371816e1d11e15e491d843a7277684202bc45e23f9f1b2e3a808bde94343a47a6a22b339aa651568ff55994260039defd790c0eb0abcf90730ecf3e097316ca87e607974544866a54d23aaaf2d089e346a68437a55afc4750b9ea1d7efcb7a6fd55c694a168f186531f0e8abb2dee73ff50ebeb2a39e1e9842013dc410e09987783cdd8e234a55388fffc025b1fe3b4036d6181ac8e6ec4d9c0822c012ac861b242b2c94433209369d0f271110d007202118e566646940f12179ee05b4e1b3c1871f09a4dbfe381d625c1166a
p = ? n = ? m = 195
assertlen(flag) == 38 secret = [] s = bytes_to_long(flag)
for i inrange(n): secret.append(random.randint(0, p))
secret = [random.randint(0, p) for _ inrange(n)] x = [[random.randint(0, 1) for _ inrange(n)] for _ inrange(m)] e = [random.randint(0, p) for _ inrange(m)] h = [(sum(secret[j] * x[i][j] for j inrange(n)) - s * e[i]) % p for i inrange(m)]