改进的混合基数转换法(MMRC)
混合基数转换法(Mixed-Radix Conversion, MRC)是求CRT唯一解的方法,Kunth对其进行了改进。可将改算法改进为改进的混合基数转换法(Modified Mixed-Radix Conversion, MMRC)。
MRC比较复杂,在这里不做介绍,可以参考《中国剩余定理在RSA解密中的应用》[1]。
MMRC
下面来介绍一下MMRC:
设同余方程组为:
\[\begin{cases}
x≡d_1\pmod{p_1}\\
x≡d_2\pmod{p_2}\\
......\\
x≡d_s\pmod{p_s}\\
\end{cases}
\]
- 计算\(B_{ji}←p_j^{-1}\pmod{p_i}(1\leqslant j<i\leqslant s)\);
- 令\(a_{i1}=d_i(1\leqslant i\leqslant s)\),由递推公式\(a_{i(j+1)}=(a_{ij}-a_{jj})B_{ji}\mod{p_i}(1\leqslant j<i\leqslant s)\),计算\(a_{11},a_{22},...,a_{ss}\);
- 计算唯一解\(x←a_{11}+a_{22}p_1+a_{33}p_1p_2+...+a_{ss}p_1p_2p_3...p_s\)。
特别地,对于只包含两个方程的方程组
\[\begin{cases}
x≡d_1\pmod{p_1}\\
x≡d_2\pmod{p_2}\\
\end{cases}
\]
可以这样计算:
- 计算\(B_{12}←p_1^{-1}\pmod{p_2}\);
- \(a_{11}=d_1\),\(a_{21}=d_2\),计算\(a_{22}=(a_{21}-a_{11})B_{12}\mod{p_2}\);
- 计算唯一解\(x←a_{11}+a_{22}p_1\)。
MMRC在RSA解密中的作用
RSA的解密过程为\(M=C^d\mod N\),而\(N=pq\)且\(p\)和\(q\)互素,所以M可以通过下式求出:
\[\begin{cases}
m_1≡C^d\pmod p\\
m_2≡C^d\pmod q\\
\end{cases}
\]
其中\(m_1=C^d\mod p\),\(m_2=C^d\mod q\)。
由此我们可以得到快速解密的算法:
- 计算\(m_1←(C\mod p)^{d\mod{p-1}}\mod p\),\(m_2←(C\mod q)^{d\mod{q-1}}\mod q\);
- 计算\(p^{-1}\pmod q\);
- 计算\(t←p^{-1}(m_2-m_1)\mod q\);
- 计算明文\(M←m_1+tp\)。
在第1步中,由于\(p\)是素数,由费马小定理[2]可得,\(C^{p-1}≡1\pmod p\),所以\((C\mod p)^{d\mod{p-1}}\mod p=C^d\mod p\),\(m_2\)同理。
下面给出我的代码,完整代码见MeanZhang/RSA: RSA-Java。
/**
* RSA解密
* 使用了MMRC算法
*
* @param c 密文
* @param d 私钥d
* @param p p
* @param q q
* @return 明文
*/
public static BigInteger decrypt(BigInteger c, BigInteger d, BigInteger p, BigInteger q) {
// m1 ≡ c^d ≡ (c mod p)^(d mod (p-1))(mod p)
BigInteger m1 = c.mod(p).modPow(d.mod(p.subtract(BigInteger.ONE)), p);
// m2 ≡ c^d ≡ (c mod q)^(d mod (q-1))(mod q)
BigInteger m2 = c.mod(q).modPow(d.mod(q.subtract(BigInteger.ONE)), q);
BigInteger invP = p.modInverse(q);
// t = p^(-1) * (m2-m1) mod q
BigInteger t = invP.multiply(m2.subtract(m1)).mod(q);
return m1.add(t.multiply(p));
}