发件人如何解密自己的加密消息

How does the sender decrypt his own encrypted message

我正在开发一个聊天应用程序,其中的消息将被端到端加密。为了实现这一点,我将 RSA 密钥与 node-forge 库一起使用。我现在可以使用收件人的 public 密钥加密消息,并仅使用他的私钥解密。问题是我希望发件人能够解密他们发送的消息,而不仅仅是接收者。我怎样才能做到这一点?

这里有一些示例代码和输出。

var simulateMessageSend = (function () {
            var plainText = "This is a test message that is going to be encrypted. "
            console.log(plainText);

            var encrypted = publickey2.encrypt(this.$forge.util.encodeUtf8(plainText));
            console.log("Encryption: ");
            console.log(encrypted)

            simulateMessageReceived(encrypted)

        }.bind(this))

var simulateMessageReceived = (function (encrypted) {

    var decrypted = this.$forge.util.decodeUtf8(privatekey2.decrypt(encrypted));

    console.log("Decryption: ");
    console.log(decrypted);

}.bind(this))

输出:

“发送方如何解密”的答案是使用混合加密系统。

(直接使用 RSA 加密不是一个好主意,因为如果您加密大于模数 n 的数据有效负载,将会丢失数据,其中模数是两个素数 pq 的乘积,对于 RSA-2048 我们使用两个 1024-bit 素数,对于 RSA-4096 我们使用两个 2048-bit 素数数).

相反,

  1. 生成一个强大的、高熵的对称密钥。
  2. 使用现代对称密码使用此对称密钥加密负载。
  3. 使用每个 收件人public RSA 密钥(在本例中为发送方和接收方)加密对称密钥。
  4. 将加密的对称密钥附加到有效载荷,发送加密消息的有效载荷 + 加密的对称密钥。
  5. 用每个对应的私钥恢复对称密钥。
  6. 使用对称密钥解密消息。

这仍然是糟糕的工程,因为:

  1. 您没有使用临时密钥,您使用的是 static:static RSA,(应该为每条消息使用临时密钥)。
  2. 不要使用 RSAcurve25519 等强曲线上使用 ECC,执行 ECDHE 以同意用于消息加密的对称原语,(请求临时 public 密钥,用你的临时私钥执行 ECDHE,用你的临时 public 密钥发送有效负载,这样接收者也可以使用 ECDHE 和他们的临时私钥来生成临时对称密钥。
  3. 使用静态 Ed25519 密钥或 3XDH.
  4. 进行身份验证

总的来说,强大的 E2E 消息传递系统很难设计。如果您使用此自制解决方案来应对严重的威胁模型,请谨慎行事。

请阅读,但如果您还有其他问题,请随时在下方提问。我很乐意用简单的语言提供更多详细信息。