我已经阅读过有关在客户端主机上生成 2 个密钥(私钥和公钥)并将公钥复制到服务器主机的信息。
据我了解,(如果我错了请纠正我):服务器使用公钥加密数据并将其发送给客户端,客户端使用私钥解密。
但是如果我需要在客户端加密数据以便发送到服务器,该怎么办呢?
公钥在客户端加密数据?但如果服务器只有公钥,它如何解密?
SSH 加密如何工作?
答案1
建立 TCP 连接后,两个系统首先要达成一致会话密钥,使用如下协议DH 密钥交换,体外循环氢可酮代谢或 GSSAPI。此密钥是对称且临时的 – 双方使用相同的密钥来加密和解密数据,使用的算法如下高级加密标准 (AES)或者RC4。
客户端密钥对从不用于加密数据,仅用于验证– “公钥”是几种可用方法之一,其中客户端提供自己的公钥以及私钥所有权证明。同样,服务器密钥对仅用于在 DH 或 ECDH 密钥交换期间对服务器进行身份验证;不会使用它来加密任何数据。
SSH2 协议的文档位于几个 RFC, 包括:
答案2
我认为您需要了解的第一件事是,虽然许多加密协议(如 SSH 和 SSL)使用 PKI 进行身份验证,但几乎没有这些系统会使用 PKI 来实际传输有效负载。
PKI 占用的 CPU 太多,无法用于传输实际的有效载荷数据。实际的情况是,PKI 用于协商随机生成的密钥,以便与对称加密协议一起使用。要使用的协议也是经过协商的,应该是两个系统可以达成一致的最强协议。因此,一旦完成初始握手和协商,几乎所有事情都只是标准的对称加密。
答案3
这里有一些实际的例子,假设密钥 A 是秘密的,因此是私钥,而密钥 B 发布在可公开访问的地方,因此是公钥。
因此,如果您想向所有人发送一条消息,并希望他们验证该消息来自您且在传递过程中未经更改,则您可以发送消息并包含使用密钥 A 加密的消息的哈希值。然后,任何拥有密钥 B 的人都可以解密哈希值,将其与他们收到的消息进行比较,并验证该消息来自您(因为只有拥有密钥 A 的人才能生成成功解密哈希值的加密有效负载,并且因为您是唯一拥有密钥 A 的人,所以它只能来自您)。这叫做签名。
现在假设某人想向您发送一条秘密消息,但不想透露他们是谁。他们可以使用对称密钥加密他们的消息(正如 Zoredache 提到的那样,对称密钥更便宜),然后获取该密钥并使用密钥 B 对其进行加密并将其发送给您。因为只有密钥 A 可以解密使用密钥 B 加密的内容,所以其他人无法看到发送给您的消息中的内容。这就是普通加密的工作原理以及 SSH 交换数据的方式。
答案4
你写
“公钥在客户端加密数据?但是,如果服务器只有公钥,它如何解密呢?”
我对此了解不多,但我认为我可以很清楚地回答这个问题。
如果 A 想要向 B 发送消息,A 会使用 B 的公钥。这样 B 就能解密消息。
如果 A 使用自己的公钥来加密消息,那么 B 确实无法解密。
此处解释
http://www.comodo.com/resources/small-business/digital-certificates2.php