Common Modulus Attack

概要

RSA暗号において、平文 {m} {n}が同一かつ {e}が異なる公開鍵 {(n,e_1),(n,e_2)}でそれぞれ暗号化した暗号文 {c_1,c_2}があり、 \begin{align} \mathrm{gcd}(e_1,e_2) = 1 \end{align} の時、 {n,e_1,e_2,c_1,c_2}から平文 {m}を導出することができる攻撃。

証明

RSA暗号の定義より、暗号文 {c_1,c_2}は以下で与えられる \begin{align} c_1 \equiv m^{e_1} \pmod{\ n} \\ c_2 \equiv m^{e_2} \pmod{\ n} \end{align} この攻撃の定義より、 \begin{align} \mathrm{gcd}(e_1,e_2) = 1 \end{align} 拡張ユークリッドの互除法により、以下を満たす {x,y}を求めることができる \begin{align} {e_1}x+{e_2}y = \mathrm{gcd}(e_1,e_2) \end{align}  {x,y}はどちらかが、負の値を持つ。今、 {x}が負であると仮定すると、 {m}は以下のように計算される。 \begin{align} ({c_1}^{-1})^{-x} (c_2)^{y} \equiv {c_1}^{x}{c_2}^{y} \pmod{\ n} \end{align}

暗号文は {c_i \equiv m^{e_i} \pmod{\ n}}であるので、 \begin{align} &\equiv (m^{e_1})^{x}(m^{e_2})^{y} \pmod{\ n} \\ &\equiv m^{e_1x+e_2y} \pmod{\ n} \end{align} 今、 {{e_1}x+{e_2}y = 1}であるので、 \begin{align} \equiv m \pmod{\ n} \end{align} となる。 {m \lt n}であるので、 \begin{align} = m \end{align} よって平文 {m}を求めることができる。

別のパターン

\begin{align} \mathrm{gcd}(e_1,e_2) \neq 1 \end{align} となってこの攻撃の条件である {\mathrm{gcd}(e_1,e_2) = 1}だけが違う場合、  {{e_1}x+{e_2}y = \mathrm{gcd}(e_1,e_2)}であるので、 \begin{align} m^{e_1x+e_2y} = m^{gcd(e_1,e_2)} \pmod{\ n} \end{align} となり {m} {\mathrm{gcd}(e_1,e_2)}乗の値が求まる。

よって平文 {m}は、 {\mathrm{gcd}(e_1,e_2)}乗根を取ると求まる。 \begin{align} m = \sqrt[gcd(e_1,e_2)]{m^{gcd(e_1,e_2)}} \end{align}

ソースコード・実行例

Common Modulus Attack

参考

Attacks on RSA - John McKeown, Grant Page, Ben Schoenfeld

Multiple-precision Integers — gmpy2 2.1.0a1 documentation