【问题标题】:RSA - How can the client (in server context) encrypt/decrypt incoming data?RSA - 客户端(在服务器上下文中)如何加密/解密传入数据?
【发布时间】:2014-07-31 23:10:54
【问题描述】:

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

这就是我想要做的:

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

随后将以加密方式发生更多流量。为了建立这种方式,我将如何既能加密客户端发送的内容,又能解密客户端接收的内容(从客户端的角度)。

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

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

提前致谢!

【问题讨论】:

    标签: java client-server rsa


    【解决方案1】:

    正如您已经指出的那样,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. 服务器用他的私钥pub_key_C = D(pri_key_S, c)解密c
    4. 服务器生成一个新的随机对称密钥key_CS
    5. 服务器用客户端的公钥c = E(pub_key_C, key_CS)加密新生成的密钥
    6. 服务器向客户端发送c
    7. 客户端用他的私钥pri_key_Ckey_CS = D(pri_key_C, c)解密密文

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


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

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

    【讨论】:

    • 在你的例子中,第一个说客户端将公钥发送到服务器,不是相反吗?虽然这对理解它很有帮助。一旦客户端收到对称密钥,加密就没有用了,因为密钥在那里可以抓取?
    • 我省略了一个步骤。通常服务器首先发送他的密钥。然后客户端发送用服务器的公钥加密的密钥。对称密钥只有客户端和服务器知道。 (因为它已被加密发送,所以窃听者无法获得任何信息)
    • 我明白了...所以在某种程度上,RSA 有点像服务器给客户端一个密封的盒子,客户端可以在其中放入他的密钥(我不知道那是什么密钥是,但我假设这个密钥将是一个对称密钥)将其密封起来并返回给服务器?
    • 之类的,通常是服务器分发密钥。服务器向客户端发送公钥主要用于验证服务器的证书/身份。
    • 好吧,让我直截了当,在连接时,服务器会向客户端发送一个对称密钥,但服务器无法加密此密钥,因为客户端在获得此密钥之前无法解密它对称密钥?
    【解决方案2】:

    首先阅读this article。那么您应该知道通常用于交换密码和电子签名的非对称算法。所以客户端-服务器加密最好的方法是生成通用加密密钥(使用 RSA 或Diffie–Hellman key exchange),然后使用任何对称算法(例如 AES)对服务器和客户端之间的数据进行编码。

    【讨论】:

    • 我明白了,所以 RSA 实际上不适合双方必须能够加密/解密的普通数据交换,但 RSA 更像是一种单向数据传输,就像你说的那样安全地发送密码?
    • 正确,RSA 在 CPU 时间和加密数据大小方面的成本要高得多,因此通常它仅用于启动连接(和/或数字签名)。
    猜你喜欢
    • 2015-10-29
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多