SSH密钥登陆服务器

2022-03-02 Views 密码 | linux1770字9 min read

操作流程

  1. 客户端制作密钥对
    [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
    
  2. 服务器安装公钥
    将客户端上的*.pub复制到服务器中,将其内容追加到~/.ssh/authorized_keys,即:
    cat id_rsa.pub >> ~/.ssh/autorized_keys
    
  3. 服务器SSH配置
    编辑/etc/ssh/sshd_config文件,进行如下设置:
    RSAAuthentication yes
    PubkeyAuthentication yes
    PermitRootLogin yes # 可选,设置是否允许root登录
    PasswordAuthentication yes # 可选,设置是否允许密码登录
    
    而后重启SSH服务:
    service sshd restart
    
  4. (另一种方式)服务器分发私钥
    生成密钥对的过程也可以在服务器上进行,那么服务器需要将私钥下发给客户端。客户端在ssh时使用-i选项可以指定私钥文件,或者在sshd_config中加入配置指定私钥:
    IdentityFile ~/.ssh/id_rsa
    

认证过程

来自ssh 公钥私钥认证原理
以下表分别指代客户端和服务器的公私钥

符号含义
Ac客户端公钥
Bc客户端密钥
As服务器公钥
Bs服务器密钥

认证之前,客户端已将公钥Ac上传至服务器,或者服务器已将私钥Bc下发给客户端。

  1. 会话密钥生成
    1. 客户端请求连接服务器,服务器将 As 发送给客户端。
    2. 服务器生成会话ID(session id),设为 p,发送给客户端。
    3. 客户端生成会话密钥(session key),设为 q,并计算 r = p xor q。
    4. 客户端将 r 用 As 进行加密,结果发送给服务器。
    5. 服务器用 Bs 进行解密,获得 r。
    6. 服务器进行 r xor p 的运算,获得 q。
    7. 至此服务器和客户端都知道了会话密钥q,以后的传输都将被 q 加密。
  2. 认证
    1. 服务器生成随机数 x,并用 Ac 加密后生成结果 S(x),发送给客户端
    2. 客户端使用 Bc 解密 S(x) 得到 x
    3. 客户端计算 q + x 的 md5 值 n(q+x),q为上一步得到的会话密钥
    4. 服务器计算 q + x 的 md5 值 m(q+x)
    5. 客户端将 n(q+x) 发送给服务器
    6. 服务器比较 m(q+x) 和 n(q+x),两者相同则认证成功

RSA原理

来自RSA算法原理(二)

预备知识

  1. 欧拉函数φ(n)\varphi(n)代表小于n的正整数中,有多少个与n构成互质关系
  2. 欧拉函数的运算律
    • φ(1)=1\varphi(1)=1
    • φ(n)=n1\varphi(n)=n-1,若n为质数
    • φ(pk)=pkpk1=pk(11p)\varphi(p^k)=p^k-p^{k-1}=p^k(1-\frac{1}{p}),若pp为指数
    • φ(n)=φ(p×q)=φ(p)×φ(q)\varphi(n)=\varphi(p\times q)=\varphi(p)\times\varphi(q),若n=p×qn=p\times qp,qp,q都为质数
    • φ(n)=n(11p1)(11pr)\varphi(n)=n(1-\frac{1}{p_1})\cdots (1-\frac{1}{p_r}),若nn可以分解为质数的积n=p1k1p2k2prkrn=p_1^{k_1} p_2^{k_2}\cdots p_r^{k_r}
  3. 欧拉定理:两个正整数a,na,n互质,则欧拉函数φ(n)\varphi(n)满足:

aφ(n)1(modn)a^{\varphi(n)}\equiv 1\pmod{n}

  1. 模反元素:两个正整数a,na,n互质,那么一定可以找到整数bb,使得ab1ab-1nn整除。bb叫做aa的模反元素:

ab1(modn)ab\equiv 1\pmod{n}

密钥生成过程

  1. 随机选择两个不相等的质数ppqq
  2. 计算ppqq的乘积n=p×qn=p\times q
  3. 计算nn的欧拉函数φ(n)=(p1)(q1)\varphi(n)=(p-1)(q-1)
  4. 随机选择一个整数e,1<e<φ(n)e, 1<e<\varphi(n), 且eeφ(n)\varphi(n)互质
  5. 计算ee对于φ(n)\varphi(n)的模反元素dd
  6. 密钥对生成完毕,公钥为(n,e)(n,e),私钥为(n,d)(n,d),其他中间变量p,q,φ(n)p,q,\varphi(n)被销毁

破解RSA需要知道dd,也即需要知道φ(n)\varphi(n),也即需要知道p,qp,q,也即要对nn做质因数分解。当n足够大时,这样的破解几乎无法做到。

加密和解密

  1. 加密:对于信息mm,根据公钥(n,e)(n,e)可以进行加密:

c=memodnc = m^e \bmod n

  1. 解密:对于密文cc,根据私钥(n,d)(n,d)可以进行解密:

m=cdmodnm = c^d \bmod n

注意被加密的信息mm必须小于nn

证明

加密的过程为

c=memodnc = m^e \bmod n

那么cc可以写成

c=meknc = m^e - kn

将其带入解密公式

cd=(mekn)d=medkn×i=0d1Cdi(me)i(kn)dicd(medkn())med(modn)c^d = (m^e-kn)^d=m^{ed}-kn\times \sum_{i=0}^{d-1}C_d^i (m^e)^i (-kn)^{d-i} \\ c^d \equiv (m^{ed}-kn(\cdots))\equiv m^{ed} \pmod{n}

由于ee对于φ(n)\varphi(n)的模反元素dd

edmodφ(n)=1ed \bmod \varphi(n) = 1

所以

ed=hφ(n)+1ed = h\varphi(n)+1

最终

cdmedmhφ(n)+1(modn)c^d\equiv m^{ed}\equiv m^{h\varphi(n)+1} \pmod{n}

(1) 当mmnn互质,根据欧拉定理

mφ(n)1(modn)m^{\varphi(n)}\equiv 1\pmod{n}

那么将mφ(n)m^{\varphi(n)}写为nn的乘积加一,再结合二项式定理可得

mhφ(n)+1((tn+1)h×m)m(modn)m^{h\varphi(n)+1} \equiv ((tn+1)^h \times m) \equiv m \pmod{n}

(2)当mmnn不互质,由于nn的因数只有p,qp,q,因此m=kpm=kpm=kqm=kqp,qp,q地位等同,不妨认为m=kpm=kp

此时kkqq互质(k<qk<qqq为质数),根据欧拉定理

(kp)q1modq=1(kp)q1=zq+1(kp)^{q-1} \bmod q = 1 \\ (kp)^{q-1} = zq+1

进一步

mhφ(n)+1=kph(p1)(q1)×kp=(zq+1)h(p1)×kp=tq+kpm^{h\varphi(n)+1} \\ =kp^{h(p-1)(q-1)}\times kp \\ =(zq+1)^{h(p-1)} \times kp \\ =tq+kp

其中tt可被pp整除(因为二项式分解后每项都乘以了kpkp)。再改写一下

mhφ(n)+1=tpq+kp=tn+mm^{h\varphi(n)+1} = t'pq+kp=t'n+m

所以

mhφ(n)+1m(modn)m^{h\varphi(n)+1} \equiv m \pmod{n}

EOF