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

标签 java client-server rsa

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

所以这是我想做的:

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

接下来的流量将以加密方式发生。要建立这种方式,我将如何能够既加密客户端发送的内容,又解密客户端接收的内容(从客户端的角度来看)。

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

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

提前致谢!

最佳答案

正如您已经指出的那样,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)

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

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


基本上原始(但非常脆弱!) key 交换看起来如何:

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

现在客户端和服务器有一个共享的 key key_CS,它们可以使用它来为正在进行的 session 安全地通信。


这样的协议(protocol)在实践中要复杂得多,包括证书、数字签名、哈希码等。可能使用最广泛的协议(protocol)是 SSL or TLS . (例如 https)。

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

关于java - RSA - 客户端(在服务器上下文中)如何加密/解密传入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25061297/

相关文章:

java - Java 中的基本计算器

javascript - 如何判断是否是我的客户端访问我的服务器?

文件同步时Java网络错误

java - 如何将 Maven 模块作为 .class 依赖项而不是 jar 嵌入?

java - 我可以在 <=1.6 的项目中检测到 target>1.6 的依赖项吗?

java - 使用正则表达式删除逗号和空格并将它们划分为不同的变量

php - 当实时生成网页时,它使用服务器端还是客户端的内存?

algorithm - 大数分解

java - 带对称 key 的 RSA

c# - 如何在 C# 中使用 RSA 加密文件(大数据)