RSA详解
最近在复习计算机安全的内容,发现网上关于RSA算法的讲解都不够详细,所以自己写一篇。
RSA算法是一个常用的公钥加密算法。
所谓的公钥加密就是用两个密钥,一个公钥一个私钥。通常来说,加密是用的公钥,解密用的私钥。而这两个密钥都是接收方的。
要理解公钥加密的优越性首先要看看对称密码的缺陷。所谓的对称加密呢就是用一个密钥来加密解密。这个时候发送方用密钥加密完了,要想办法把密钥发给接收方去解密。这就可能导致在发送密钥的时候密钥被人截获。
而公钥密码呢,接收方把公钥发给发送方去加密,而解密的私钥一直在接收方手上。这样密钥就不会被截获。公钥是公开的,就算拿到公钥也不能倒推解密出明文,当然也不能从公钥推出私钥,这就是它的安全之处。下面我们以RSA为例来看看神奇的公钥加密。
先来看看RSA的伪代码:
n = p ∗ q p,q是随便两个大质数 φ ( n ) = ( p − 1 ) ( q − 1 ) φ ( n ) 是欧拉函数,见下详解 e = r a n d ( 1 , φ ( n ) ) , g c d ( e , φ ( n ) ) = 1 e是公钥,gcd是公约数 d e ≡ 1 ( m o d φ ( n ) ) d是私钥,这个式子的意思见下详解 \begin{aligned}n&=p∗q\quad\text{p,q是随便两个大质数}\\\varphi(n)&=(p−1)(q−1)\quad\text{$\varphi(n)$是欧拉函数,见下详解}\\e&=rand(1,\,\varphi(n)),\quad gcd(e,\,\varphi(n))=1\quad\text{e是公钥,gcd是公约数}\\de&\equiv1 (mod\,\varphi(n))\quad\text{d是私钥,这个式子的意思见下详解}\end{aligned} nφ(n)ede=p∗qp,q是随便两个大质数=(p−1)(q−1)φ(n)是欧拉函数,见下详解=rand(1,φ(n)),gcd(e,φ(n))=1e是公钥,gcd是公约数≡1(modφ(n))d是私钥,这个式子的意思见下详解
生成两个密钥后,加密过程非常简单:
m是明文,c是密文 c = m e m o d n 用公钥e,n加密 m = c d m o d n 用私钥d,n解密 \begin{aligned}&&\text{m是明文,c是密文}\\c&=m^e\;mod\;n&\text{用公钥{e,n}加密}\\m&=c^d\;mod\;n&\text{用私钥{d,n}解密}\end{aligned} cm=memodn=cdmodnm是明文,c是密文用公钥e,n加密用私钥d,n解密
首先明确常识:mod就是%。
下面我们来详细地看看RSA。
欧拉函数
欧拉函数代表的是2到x之间和x互质的数的数量。既给了一个x,想看看有多少个小于x的数和x互质,就用欧拉函数。
∀ x ∈ Z p ∗ 既x是2到p之间和p互质的整数 x p − 1 = 1 m o d p x φ ( p ) = 1 m o d p 其中欧拉函数 φ ( p ) = ∣ Z p ∗ ∣ ∣ Z p ∗ ∣ 是 Z p ∗ 中的元素个数 φ ( p ∗ q ) = ( p − 1 ) ( q − 1 ) 其中p, q皆为素数。 若 g c d ( e , φ ( p ) ) = 1 , e d + k φ ( p ) = 1 , 则 e d = 1 m o d φ ( p ) , 则 d = e − 1 m o d φ ( p ) e − 1 是 e 的乘法逆元,既 e − 1 e m o d φ ( p ) = 1 \begin{aligned} \forall x&∈Z_p^∗&\text{既x是2到p之间和p互质的整数}\\ x^{p−1}&=1\,mod\,p\\ x^{\varphi(p)}&=1\,mod\,p\\ \text{其中欧拉函数}\,\varphi(p)&=|Z_p^∗ |&\text{$|Z_p^∗ |$是$Z_p^*$中的元素个数}\\ \varphi(p∗q)&=(p−1)(q−1)&\text{其中p, q皆为素数。}\\ \text{若}\,gcd(e,\,\varphi(p))&=1,\\ ed+k\varphi(p)&=1,\\ \text{则}\,ed&=1\,mod\,\varphi(p),\\ \text{则}\,d&=e^{−1}\,mod\,\varphi(p)\\ \text{$e^{−1}$是$e$的乘法逆元,既}\,e^{−1}e\,mod\,\varphi(p)&=1\\ \end{aligned} ∀xxp−1xφ(p)其中欧拉函数φ(p)φ(p∗q)若gcd(e,φ(p))ed+kφ(p)则ed则de−1是e的乘法逆元,既e−1emodφ(p)∈Zp∗=1modp=1modp=∣Zp∗∣=(p−1)(q−1)=1,=1,=1modφ(p),=e−1modφ(p)=1既x是2到p之间和p互质的整数∣Zp∗∣是Zp∗中的元素个数其中p, q皆为素数。
欧几里得算法(辗转相除法)
好像高中就学过,是用来算两个数的公因数的。
欧几里得算法本质上就是一个递推式:
g c d ( a , b ) = g c d ( b , a % b ) , a ≥ b gcd(a,\,b)=gcd(b,\,a\%b), a\geq b gcd(a,b)=gcd(b,a%b),a≥b
下面是它的证明(嫌长可以不看):
i f a = q b + r , r < b t h e n r = a − q b = a % b ∵ a , b % g c d ( a , b ) = 0 ∴ r % g c d ( a , b ) = [ a % g c d ( a , b ) − q b % g c d ( a , b ) ] % g c d ( a , b ) = 0 ∴ g c d ( a , b )