我无法准确理解 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 交换看起来如何:
- 服务器向客户端发送他的公钥
pub_key_S
- 客户端向服务器发送他的公钥,并用服务器的公钥加密
c = E(pub_key_S, pub_key_C)
- 服务器用他的私钥
pub_key_C = D(pri_key_S, c)
解密c
- 服务器生成一个新的随机对称 key
key_CS
- 服务器用客户端的公钥加密新生成的 key
c = E(pub_key_C, key_CS)
- 服务器发送
c
给客户端 - 客户端用他的私钥解密密文
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/