【RSA】Common Modulus Attackの仕組みと実装

投稿日: 更新日:

使える条件

同じ平文MMNNが共通かつgcd(e1,e2)=1\gcd(e_1, e_2)=1の公開鍵(N,e1)(N, e_1), (N,e2)(N, e_2)で暗号化されたときに使えます。

平文の導出方法

まず暗号文C1,C2C_1, C_2は以下の式で示されます。

C1=Me1modNC2=Me2modNC_1 = M^{e_1} \mod N \\ C_2 = M^{e_2} \mod N

gcd(e1,e2)=1\gcd(e_1, e_2)=1より以下の式を満たす整数(a,b)(a, b)が存在します。

a×e1+b×e2=1a \times e_1 + b\times e_2 = 1

C1a,C2b{C_1}^a, {C_2}^bを考えていくと

C1aC2b=Ma×e1Mb×e2modN=Ma×e1+b×e2modN\begin{aligned} {C_1}^a {C_2}^b &= M^{a \times e_1}M^{b \times e_2} \mod N \\ &= M^{a \times e_1 + b\times e_2} \mod N \end{aligned}

ここでa×e1+b×e2=1a \times e_1 + b\times e_2=1であったので

C1aC2bM1modNMmodN\begin{aligned} {C_1}^a {C_2}^b &\equiv M^{1} \mod N \\ &\equiv M \mod N \end{aligned}

となり、平文MMが導出できました!

Pythonでの実装

多倍長に対応しているので簡単に大きな数の計算ができます!

def extgcd(a, b):
    #拡張ユークリッド互除法
    #ax + by = gcd(a, b)となる(x, y)を求めます
    if b == 0:
        return [1, 0]

    q = a//b
    r = a%b
    
    s, t = extgcd(b, r)
    y = s - q*t
    return [t, y]

def common_modulus_attack(c1, c2, e1, e2, n):
    #c1:暗号文1, c2:暗号文2
    a, b = extgcd(e1, e2)# a*c1 + b*c2 = 1 となる(a, b)を計算する
    m1 = pow(c1, a, n)# c1^a mod N の計算
    m2 = pow(c2, b, n)# c2^a mod N の計算
    return (m1 * m2) % n

練習問題

NNは共通です。e1e_1で暗号化したものがC1C_1e2e_2で暗号化したものがC2C_2です!
平文MMを出してください。 ※答えは数値です

N=60963434132501314035336447525947508568978923800339967543702272746525205013233
e1=58757
C1=27726517759308413313356903988967832327531954882576351327358580190426923118280
e2=61333
C2=11271012342421722589415390254769559241378949949302863047216142534228523047931

練習問題の解答

紹介したPythonのコードを使って解きます!

n = 60963434132501314035336447525947508568978923800339967543702272746525205013233  
e1 = 58757  
c1 = 27726517759308413313356903988967832327531954882576351327358580190426923118280  
e2 = 61333  
c2 = 11271012342421722589415390254769559241378949949302863047216142534228523047931  

ans = common_modulus_attack(c1, c2, e1, e2, n)

print(f"M = {ans}")

出力

M = 1234

参考文献

Karakra, Abdallah, and Ahmad Alsadeh. "A-RSA: Augmented RSA." 2016 SAI Computing Conference (SAI). IEEE, 2016.

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人