RSA - 客户端(在服务器上下文中)如何加密/解密传入数据?

Lim*_*nic 5 java client-server rsa

我无法准确理解 RSA 的工作原理。许多例子和定义试图解释但使用了模糊的上下文。

所以这就是我想做的:

我有一台使用 RSA 并具有私钥和公钥的服务器。据我了解,连接后,服务器以未加密的方式将公钥发送到服务器。如果您愿意的话,可以进行某种握手。

然后,进一步的流量将以加密的方式发生。为了建立这种方式,我如何能够加密客户端发送的内容,并解密客户端接收的内容(从客户端的角度来看)。

在服务器端,加密的数据由私钥解密,但如果没有该私钥,我无法解密客户端中的数据......我不能在客户端中拥有该私钥,因为它是秘密的。

这让我很困惑,我是否遗漏了一些明显的东西,或者是否需要第二个私钥?

提前致谢!

i_t*_*uro 6

正如您已经指出的,RSA是一种非对称加密方案,这意味着:

c = E(pub_key, m) // ciphertext = encryption(public key,  message)
m = D(pri_key, c) // message    = decryption(private key, ciphertext)
Run Code Online (Sandbox Code Playgroud)

相比之下,对称加密方案(例如前面的AES)的工作原理如下:

c = E(key, m)
m = E(key, c)
Run Code Online (Sandbox Code Playgroud)

换句话说,相同的密钥用于加密和解密。

这就是非对称密码系统发挥作用的地方。它允许各方安全地交换对称加密的密钥。


基本上,原始(但非常脆弱!)密钥交换看起来是这样的:

  1. 服务器将其公钥发送给客户端pub_key_S
  2. 客户端将其公钥用服务器的公钥加密发送到服务器
    c = E(pub_key_S, pub_key_C)
  3. 服务器c用他的私钥解密pub_key_C = D(pri_key_S, c)
  4. 服务器生成一个新的随机对称密钥key_CS
  5. 服务器用客户端的公钥加密新生成的密钥c = E(pub_key_C, key_CS)
  6. 服务器发送c给客户端
  7. 客户端用他的私钥解密密文pri_key_C key_CS = D(pri_key_C, c)

现在,客户端和服务器拥有一个共享密钥key_CS,它们可以使用该密钥来安全地进行正在进行的会话通信。


这样的协议实际上要复杂一些,包括证书、数字签名、哈希码等。最广泛使用的协议可能是SSL 或 TLS。(例如https)。

如果您对此类协议的详细信息感兴趣,我建议您查看该链接。