としておいて、
か? → ならYes
で、ある について
(ただし
続いて、
なので、引いて掛ければよい
で かけるのも
その次は
なので、引いて掛ければ良い。実装的にはを持ってるはずなので引けばよくなる
……という理論に基づいて書いてみたけどうまく動かない↓
from Crypto.Util.number import * p = getPrime(256) q = getPrime(256) n = p * q e = 65537 d = inverse(e, n - p - q + 1) primes = [659, 809, 719, 647, 809, 653, 691, 911, 677] m = getRandomNBitInteger(128) c = pow(m, e, n) M = primes[0] def oracle(x): return pow(x, d, n) % M X = 1 for p in primes: X *= p Y = 1 for p in primes[1:]: Y *= p z = oracle(c) print(z, m % M) for i in range(1, 10): inv = inverse(X ** i, n) c2 = (c * pow(inv, e, n)) % n o = oracle(c2) ith_z = ((o - z*inv) * pow(Y, i, n) % n) % M z = ith_z * (M ** i) + z mm = m for _ in range(i): mm = mm // M print([z, m % (M ** (i + 1))], [ith_z, mm % M])
というのも
として、
なので、
を進数で示す必要がある。すなわち
で、じゃあ返ってくるのは ということになる
はで求められそう。
ということはは返ってきたオラクル として、で求まりそう。
ということは をどうやって求めるかなんだよな
のはずなので、
(はでのの、での逆数をとった値)
(のにおける逆数)
ということになりそう?
一般化して、
で、返ってくるのは、として
今手元にはがあるはずなので、
で、
として