RSAで一部の値がわかっている時

RSA

Recovering cryptographic keys from partial information, by example

参考文献

Recovering cryptographic keys from partial information, by example

eが小さく、mの大部分がわかっている時

 m_{pad} = 0x1FFFFFF..0000 + m

 c = m_{pad}^e \mod N

のようなとき。

 a = 0x1FFFFFF...0000とおいて

 f(x) = (a+x)^e - cについて

 f(m) \equiv 0 \mod Nだから、この fのsmall rootsを求めれば良い

pの上位半分がわかっているとき

 p = 2^la + r と表して、 a既知、 r未知のとき

 f(x) = 2^la + x について

 f(r) = p \equiv 0 \mod p なので、適当なBound  R = 2^l をおいて、small root  r < Rを探す

このsmall rootを探すには

 \begin{pmatrix} R^2 & R2^la & 0 \ 0 & R & 2^la \ 0 & 0 & N \end{pmatrix} = \begin{pmatrix}x(2^la + x) \ 2^la + x \ N \end{pmatrix}

LLLして出る v = (f_2R^2, f_1R, f_0)から f' = f_2x^2 + f_1x + f_0とサイズを小さくした方程式をつくって、これの small rootを探せば良い

どうしてmod pの方程式の解がNを使って求められるんですか?

  • May先生がそういうcoppersmith's methodの拡張をやってくれたから

  • 上記の行列のそれぞれの行が  x = r のときに  \mod p で0になるから(多分)

PRIME_SIZE = 512
KNOWN_SIZE = 270

p = random_prime(1<<PRIME_SIZE)
q = random_prime(1<<PRIME_SIZE)
n = p * q

high_p = p >> (PRIME_SIZE - KNOWN_SIZE) << (PRIME_SIZE - KNOWN_SIZE)
PR.<x> = PolynomialRing(Zmod(n))
f = high_p + x

set_verbose(2)
r = f.small_roots(X=2^(PRIME_SIZE - KNOWN_SIZE), beta=0.25, epsilon=0.005)

p_ = int(r[0] + high_p)
assert p == p_

pの下位半分がわかっている時

 p = 2^lr + a a既知、 r未知のとき

同様に

 f(x) = 2^lx + aとして解くだけ

PRIME_SIZE = 512
KNOWN_SIZE = 270

p = random_prime(1<<PRIME_SIZE)
q = random_prime(1<<PRIME_SIZE)
n = p * q

MOD = 1<<KNOWN_SIZE
low_p = p % MOD
PR.<x> = PolynomialRing(Zmod(n))
f = low_p + x*MOD
f = f.monic()

set_verbose(2)
r = f.small_roots(X=2^(PRIME_SIZE - KNOWN_SIZE), beta=0.25, epsilon=0.005)

p_ = int(low_p + r[0]*MOD)
assert p == p_

pの上位半分とqの下位半分がわかっている時

pの真ん中半分がわかっている時

 p = 2^ts + 2^la + r a既知、 l, r未知の時

適当なBound  Rがあって  s, r &lt; R

次のような関数

 f(x, y) = 2^tx + 2^la + y

に対して

 f(s, r) = p \equiv 0 \mod p

だから、多変数多項式  fのsmall rootsが求まれば良い

多変数多項式のsmall rootsが求まるような行列をどうやって作るのか……? なんでこうなるんだろう。

 \begin{pmatrix} f^3 \ f^2y \ fy^2 \ y^3N \ f^2 \ fy \ y^2N \ f \ yN \ N \end{pmatrix}

[**  d_p の上位半分がわかっているとき]

 d_p = d \mod (p-1) の上位bitがわかっている。すなわち

 d_p = 2^la + r a既知、 r未知の時

 ed_p = 1 + k_p(p-1) より

 e(2^la + r) - 1 + k_p \equiv 0 \mod p

 2^la + r + e^{-1}(k_p - 1) \equiv 0 \mod p

したがって

 f(x) = 2^la + e^{-1}(k_p - 1) + x

とすると

 f(r) \equiv 0 \mod p

 A = 2^la + e^{-1}(k_p - 1)とおくと

 f(x) = A + xなので、pの上位bitがわかっているときと同様に解ける

一方[*  d_pの下位半分]がわかっていても k_pを求めるのが難しい