1.非对称加密与数字签名

a.非对称加密

在非对称加密中有不同的密钥:私钥(private key)和公钥(public key)。如果A和B进行通信,A需要创建两个密钥:一个私钥和一个公钥,A把公钥分发给社区,公钥不需要保密(但需要提供身份验证和数据完整性,防止他人冒充A)。B向A发送信息时使用A的公钥加密明文,A收到信息后可用自己的密钥解密。

使用PA表示A的公钥,使用SA表示A的私钥,M表示信息,C表示密文,σ表示数据签名,则信息的传递方式为:

               B                不安全信道[传输C=PA(M)]                A
M -----> [B使用PA加密] ========================================> [A使用SA解密] -----> M=SA(C)

b.数字签名

数字签名用于验证消息发送者信息,当A向B发送消息是,B需要检查发送者(A)的身份,这时A可以用自己的私钥进行签名,B可用A的公钥进行验证。

                 A                                                            B
    ----> [A使用SA签名] ----                                       ----> [B使用PA验证σ] ------
    |                      |                                       |                         |
    |                      |                                       |                         v
    |                      |                                       |                [判断M是否等于PA(σ)] --> 接受?
    |                      |                                       |                         ^
    |                      v     不安全信道[传输(M, σ=SA(M))]      |                         |
M-----------[传输M]----------> ================================> -------------[传输M]---------

Signature = Sign(Message, sa)
Verify(Message, Signature, pa) = True/False

2.对应ssh命令

a.登录远程主机

远程登录主机”host”时,在本地输入命令(host_name可以是主机的ip地址):

$ ssh user_name@host_name

请求登录host,这时会询问是否接受host的公钥,接收后会要求输入你的登录密码,输入的密码会用host的公钥进行加密,host接收加密后的登录信息后,会用自己的私钥解密,确认后会允许登录。这样你的登录信息就不会泄露给他人(即便被他人截获登录信息,但无host私钥,所以无法获得你的登录信息)。

b.生成自己的公钥与私钥

在本地输入命令:

$ ssh-keygen -t rsa -C "you-key-comment"

会在在目录~/.ssh中生成私钥: id_rsa, 公钥: id_rsa.pub

c.上传公钥与免密码登录(数字签名)

输入命令上传公钥到host:

$ ssh-copy-id user_name@host_name

host会最后一次要求你输入密码确认身份,密码正确后会将公钥加到host的/home/user_name/.ssh/authorized_keys文件中,此后你再次登录时,host会向你发送信息,你用自己的私钥进行数字签名后发送给host,host用你的公钥进行验证,验证成功后会允许登录,不需要输入密码。