\(\mathcal{共模攻击概述}\)

共模攻击是一种攻击 \(\mathcal{RSA}\) 加密的技术,当两个密文使用相同的 \(\mathcal{RSA}\) 公共模数时,攻击者可以使用中国剩余定理\(\mathcal{(CRT)}\)和最大公因数\(\mathcal{(GCD)}\)算法,推导出明文。这种攻击技术利用的是\(RSA\)加密算法中的数学性质,特别是模运算具有分配律和结合律的属性。共模攻击只需要拥有两个使用相同的公共模数加密的密文就能够推导出明文。因此,RSA算法的安全性在很大程度上依赖于保护其公共模数的机密性。

n:RSA公共模数
e1 & e2:RSA加密密钥指数
c1 & c2:对同一明文加密后得到的两个密文

使用 \(gmpy2.gcdext()\) 函数来计算两个密钥指数\(e1\)\(e2\)的最大公因数,以及用于计算解密密钥的系数\(s1\)\(s2\)。这些系数可以通过下面的式子计算得出:

s1 * e1 + s2 * e2 = gcd(e1, e2)

这里的 \(gcdext\) 函数返回三个参数,其中第一个是最大公因数,第二个是 \(s1\) ,第三个是 \(s2\)

然后,代码计算明文\(m\),通过以下公式来计算:

m = (c1^s1 * c2^s2) mod n

\(\mathcal{CRT优化}\)

可以使用中国剩余定理 \((CRT)\) 来优化这段代码,这样可以更快地计算明文 \(m\) ,从而提高解密的效率。 \(CRT\) 可以利用多个同余方程求解一个线性方程组,这个线性方程组的解就是原来的方程组的解。

假设p和q是n的两个质因数,它们分别满足以下条件:

p ≡ 1 (mod e1)
p ≡ 0 (mod e2)
q ≡ 0 (mod e1)
q ≡ 1 (mod e2)

这里 \(e1\)\(e2\) 分别是RSA加密的两个密钥指数。

我们可以使用 \(CRT\) 求解 \(m\) ,其计算公式如下:

m = (c1 * q * gmpy2.invert(q, p) + c2 * p * gmpy2.invert(p, q)) mod n

在这个公式中,\(invert()\) 函数用于计算模 \(p\)\(q\) 的逆元,即p或q的乘法逆元,其中 \(n = p * q\)

下面是优化后的代码:

p = gmpy2.powmod(c1, e1, n)
q = gmpy2.powmod(c2, e2, n)

p1 = gmpy2.invert(q, n)
q1 = gmpy2.invert(p, n)

m = (c1 * q * p1 + c2 * p * q1) % n