RSA算法和ssh登录详解
RSA算法
数学原理
费马小定理: 若\(a \in Z , p \in P\), 则\(a^{p}-a\)一定是p的倍数.
即\((a^{p}-a)/p\)的余数为零, \(a^{p}/p\)和\(a/p\)同余, \(a^{p} \equiv a (mod\ p)\). 如果a不是p的倍数, 则\(a^{p-1}-1\)是p的倍数.
欧拉-费马小定理: 若\(a \in Z , n \in Z\), 且a,n互素, 则\(a^{\varphi(n)}-1 \equiv 1 (mod\ n)\).
其中, 若n为质数,\(\varphi(n)=n-1\). 若p,q互质, 则\(\varphi(pq)=(p-1)(q-1)\).
假设Alice要给Bob发送信息, 需要对信息进行加密, 首先需要确定公私钥.
-
Alice首先选取两个大质数p,q, \(N=pq\), 由欧拉函数的性质, \(\varphi(N)=(p-1)(q-1)\).
-
选取一个数e, 使得\(1<e<\varphi(N)\), 且e与\(\varphi(N)\)互质. 得到公钥(N,e).
-
根据选取的e, 找另一个数d, 使得\(ed \equiv 1 (mod\ \varphi(N))\), 即\(ed/\varphi(N)\)余1. 得到私钥(N,d)
\(\exists d \iff e\perp\varphi(N)\)
加密及解密
-
Alice首先确定N, 公钥e, 私钥d. 并把(N,e)传送到Bob端.
-
Bob收到公钥(N,e)后, 把发送的数据通过某种方法转化为数字m, \(m<N\). 如果太大, 可以进行切片分批发送.
对m进行加密, 取\(m^{e}/N\)的余数c, c就是密文, \(c \equiv m^{e}(mod\ N)\). Bob把c传输给Alice.
-
Alice收到密文c后, 取\(c^{d}/N\)的余数, 这个余数一定就是m, \(m \equiv c^{d}(mod\ N)\). 这样就实现了解密.
\(c = m^{e} + N的倍数\)
\(c^{d} = (m^{e} + N的倍数)^{d}\)
\(c^{d} = m^{ed} + N的倍数\)
\(c^{d} = m^{1+\varphi(N)的倍数}+N的倍数\)
\(c^{d} = m(m^{\varphi(N)的倍数})+N的倍数\)
\(c^{d} = m(1+N的倍数)+N的倍数\) 欧拉-费马小定理
\(c^{d} = m + N的倍数\)
安全性
公钥e, 密文c和N是可以截取到的, 而私钥d是自身保留的, 如果没有私钥d, 只通过N和e来解密是非常困难的.
假设黑客拥有e, c, N. 如果需要求d, 通过d的构造方法可知, 需要知道\(\varphi(N)\), 从而需要知道p和q. 这就涉及到质因数分解, 对于一个非常大的数N, 分解是非常困难的.
SSH免密登录过程
在登录Linux的过程中, 可以通过SSH来免密登录, 其中的加密算法就是RSA算法.
客户端(Client)就相当于Alice, 而Linux服务端(Server)相当于Bob. 客户端生成公钥(N,e)和私钥(N,d), 把公钥发送到服务端进行保存.
登录的过程:
-
Client发送登录请求, 其中包括用户名和IP地址.
-
Server收到后, 查找用户对应的公钥(N,e), 随机生成一段字符串m, 并通过公钥进行加密得到密文c. 把密文c发送给Client.
-
Client收到密文c后, 通过私钥(N,d)进行解密, 得到原始字符串m, 再把m发送给Server.
-
Server比对收到的m, 如果相同, 则同意登录, Client实现了免密登录.