操作流程
- 客户端制作密钥对
[root@host ~]$ ssh-keygen <== 建立密钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): <== 按 Enter
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): <== 输入密钥锁码,或直接按 Enter 留空
Enter same passphrase again: <== 再输入一遍密钥锁码
Your identification has been saved in /root/.ssh/id_rsa. <== 私钥
Your public key has been saved in /root/.ssh/id_rsa.pub. <== 公钥
The key fingerprint is:
0f:d3:e7:1a:1c:bd:5c:03:f1:19:f1:22:df:9b:cc:08 root@host
- 服务器安装公钥
将客户端上的*.pub复制到服务器中,将其内容追加到~/.ssh/authorized_keys
,即:cat id_rsa.pub >> ~/.ssh/autorized_keys
- 服务器SSH配置
编辑/etc/ssh/sshd_config
文件,进行如下设置:RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin yes # 可选,设置是否允许root登录
PasswordAuthentication yes # 可选,设置是否允许密码登录
而后重启SSH服务:service sshd restart
- (另一种方式)服务器分发私钥
生成密钥对的过程也可以在服务器上进行,那么服务器需要将私钥下发给客户端。客户端在ssh时使用-i选项可以指定私钥文件,或者在sshd_config中加入配置指定私钥:IdentityFile ~/.ssh/id_rsa
认证过程
来自ssh 公钥私钥认证原理
以下表分别指代客户端和服务器的公私钥
符号 | 含义 |
---|
Ac | 客户端公钥 |
Bc | 客户端密钥 |
As | 服务器公钥 |
Bs | 服务器密钥 |
认证之前,客户端已将公钥Ac上传至服务器,或者服务器已将私钥Bc下发给客户端。
- 会话密钥生成
- 客户端请求连接服务器,服务器将 As 发送给客户端。
- 服务器生成会话ID(session id),设为 p,发送给客户端。
- 客户端生成会话密钥(session key),设为 q,并计算 r = p xor q。
- 客户端将 r 用 As 进行加密,结果发送给服务器。
- 服务器用 Bs 进行解密,获得 r。
- 服务器进行 r xor p 的运算,获得 q。
- 至此服务器和客户端都知道了会话密钥q,以后的传输都将被 q 加密。
- 认证
- 服务器生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端
- 客户端使用 Bc 解密 S(x) 得到 x
- 客户端计算 q + x 的 md5 值 n(q+x),q为上一步得到的会话密钥
- 服务器计算 q + x 的 md5 值 m(q+x)
- 客户端将 n(q+x) 发送给服务器
- 服务器比较 m(q+x) 和 n(q+x),两者相同则认证成功
RSA原理
来自RSA算法原理(二)
预备知识
- 欧拉函数φ(n)代表小于n的正整数中,有多少个与n构成互质关系
- 欧拉函数的运算律
- φ(1)=1
- φ(n)=n−1,若n为质数
- φ(pk)=pk−pk−1=pk(1−p1),若p为指数
- φ(n)=φ(p×q)=φ(p)×φ(q),若n=p×q且p,q都为质数
- φ(n)=n(1−p11)⋯(1−pr1),若n可以分解为质数的积n=p1k1p2k2⋯prkr
- 欧拉定理:两个正整数a,n互质,则欧拉函数φ(n)满足:
aφ(n)≡1(modn)
- 模反元素:两个正整数a,n互质,那么一定可以找到整数b,使得ab−1被n整除。b叫做a的模反元素:
ab≡1(modn)
密钥生成过程
- 随机选择两个不相等的质数p和q
- 计算p和q的乘积n=p×q
- 计算n的欧拉函数φ(n)=(p−1)(q−1)
- 随机选择一个整数e,1<e<φ(n), 且e与φ(n)互质
- 计算e对于φ(n)的模反元素d
- 密钥对生成完毕,公钥为(n,e),私钥为(n,d),其他中间变量p,q,φ(n)被销毁
破解RSA需要知道d,也即需要知道φ(n),也即需要知道p,q,也即要对n做质因数分解。当n足够大时,这样的破解几乎无法做到。
加密和解密
- 加密:对于信息m,根据公钥(n,e)可以进行加密:
c=memodn
- 解密:对于密文c,根据私钥(n,d)可以进行解密:
m=cdmodn
注意被加密的信息m必须小于n
证明
加密的过程为
c=memodn
那么c可以写成
c=me−kn
将其带入解密公式
cd=(me−kn)d=med−kn×i=0∑d−1Cdi(me)i(−kn)d−icd≡(med−kn(⋯))≡med(modn)
由于e对于φ(n)的模反元素d
edmodφ(n)=1
所以
ed=hφ(n)+1
最终
cd≡med≡mhφ(n)+1(modn)
(1) 当m与n互质,根据欧拉定理
mφ(n)≡1(modn)
那么将mφ(n)写为n的乘积加一,再结合二项式定理可得
mhφ(n)+1≡((tn+1)h×m)≡m(modn)
(2)当m与n不互质,由于n的因数只有p,q,因此m=kp或m=kq。p,q地位等同,不妨认为m=kp。
此时k与q互质(k<q且q为质数),根据欧拉定理
(kp)q−1modq=1(kp)q−1=zq+1
进一步
mhφ(n)+1=kph(p−1)(q−1)×kp=(zq+1)h(p−1)×kp=tq+kp
其中t可被p整除(因为二项式分解后每项都乘以了kp)。再改写一下
mhφ(n)+1=t′pq+kp=t′n+m
所以
mhφ(n)+1≡m(modn)