跳转至

RSA算法

RSA算法概述

MIT三位年青学者Rivest,Shamir和Adleman在1978年发现了一种用数论构造双钥体制的方法,称作MIT体制,后来被广泛称之为RSA体制

既可以用于加密,又可以用于数字签名

RSA算法的安全性基于数论中的大整数分解的困难问题

RSA算法步骤

密钥生成

选择两个大素数\(p\)\(q\),计算它们的乘积\(n=pq\)

计算\(n=pq,\varphi(n)=(p-1)(q-1)\)

  • 公钥\(e\),随机选择\(e\),使得\(1<e<\varphi(n),gcd(e,\varphi(n))=1\)
  • 私钥\(d\),计算\(d\),使得\(ed\equiv 1\ (\text{mod}\ \varphi(n))\)

加密

明文\(m\),公钥\(e\),加密过程如下:

\[c=m^e\ (\text{mod}\ n)\]

解密

密文\(c\),私钥\(d\),解密过程如下:

\[m=c^d\ (\text{mod}\ n)\]

补充

快速指数运算

\[e=b_k 2^k+b_{k-1} 2^{k-1}+\cdots+b_1 2+b_0\]
\[m^e =(\dots((((m^{b_k})^2)\times m^{b_{k-1}})^2)\dots \times m^{b_1})^2\times m^{b_0}\]

RSA算法的加密和解密运算都用到幂运算和取模运算,根据取模运算的性质,我们可以使用快速幂取模的方式来进行快速且不溢出的运算

快速模幂算法示例:

def quick_pow(m,e,n) 
    ans = 1
    while e:
        if e & 1:
            ans = (ans * m) % n
        m = m * m % n
        e >>= 1
    return ans

RSA的解密正确性

假设\(m\)是明文,\(c\)是公钥加密得到的密文,\(d\)是私钥,\(n\)是公钥的模数,\(e\)是公钥的指数。

\[\begin{align*} C^d\mod n=(m^e)^d\mod n=m^{ed}\mod n\\ =m^{k\varphi(n)+1}\mod n\\ =m\mod n\\ =m(m<n) \end{align*}\]

由欧拉定理有\(m^{k\varphi(n)}\equiv 1\mod n\)