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

时间:2014-07-31 14:19:19

标签: java client-server rsa

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

所以这就是我想要做的事情:

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

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

在服务器端,加密数据由私钥解密,但我无法在没有私钥的情况下解密客户端中的数据......我无法在客户端解密,因为它是秘密。

这让我感到困惑,我错过了一些明显的东西,还是需要第二个私钥?

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

c = E(pub_key, m) // ciphertext = encryption(public key,  message)
m = D(pri_key, c) // message    = decryption(private key, ciphertext)

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

c = E(key, m)
m = E(key, c)

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

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


基本上,原始(但非常脆弱!)密钥交换的外观如何:

  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 or TLS。 (例如 https )。

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

答案 1 :(得分:0)

首先阅读this article。然后你应该知道通常使用非对称算法来交换密码和电子标志。因此,客户端 - 服务器加密的最佳方式是生成通用加密密钥(使用RSA或Diffie–Hellman key exchange),然后使用任何对称算法(例如AES)在服务器和客户端之间编码数据。