发件人如何解密自己的加密消息
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
的数据有效负载,将会丢失数据,其中模数是两个素数 p
和 q
的乘积,对于 RSA-2048
我们使用两个 1024-bit
素数,对于 RSA-4096
我们使用两个 2048-bit
素数数).
相反,
- 生成一个强大的、高熵的对称密钥。
- 使用现代对称密码使用此对称密钥加密负载。
- 使用每个 收件人public
RSA
密钥(在本例中为发送方和接收方)加密对称密钥。
- 将加密的对称密钥附加到有效载荷,发送加密消息的有效载荷 + 加密的对称密钥。
- 用每个对应的私钥恢复对称密钥。
- 使用对称密钥解密消息。
这仍然是糟糕的工程,因为:
- 您没有使用临时密钥,您使用的是 static:static
RSA
,(应该为每条消息使用临时密钥)。
- 不要使用
RSA
在 curve25519
等强曲线上使用 ECC
,执行 ECDHE
以同意用于消息加密的对称原语,(请求临时 public 密钥,用你的临时私钥执行 ECDHE,用你的临时 public 密钥发送有效负载,这样接收者也可以使用 ECDHE 和他们的临时私钥来生成临时对称密钥。
- 使用静态
Ed25519
密钥或 3XDH
. 进行身份验证
总的来说,强大的 E2E 消息传递系统很难设计。如果您使用此自制解决方案来应对严重的威胁模型,请谨慎行事。
请阅读,但如果您还有其他问题,请随时在下方提问。我很乐意用简单的语言提供更多详细信息。
我正在开发一个聊天应用程序,其中的消息将被端到端加密。为了实现这一点,我将 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
的数据有效负载,将会丢失数据,其中模数是两个素数 p
和 q
的乘积,对于 RSA-2048
我们使用两个 1024-bit
素数,对于 RSA-4096
我们使用两个 2048-bit
素数数).
相反,
- 生成一个强大的、高熵的对称密钥。
- 使用现代对称密码使用此对称密钥加密负载。
- 使用每个 收件人public
RSA
密钥(在本例中为发送方和接收方)加密对称密钥。 - 将加密的对称密钥附加到有效载荷,发送加密消息的有效载荷 + 加密的对称密钥。
- 用每个对应的私钥恢复对称密钥。
- 使用对称密钥解密消息。
这仍然是糟糕的工程,因为:
- 您没有使用临时密钥,您使用的是 static:static
RSA
,(应该为每条消息使用临时密钥)。 - 不要使用
RSA
在curve25519
等强曲线上使用ECC
,执行ECDHE
以同意用于消息加密的对称原语,(请求临时 public 密钥,用你的临时私钥执行 ECDHE,用你的临时 public 密钥发送有效负载,这样接收者也可以使用 ECDHE 和他们的临时私钥来生成临时对称密钥。 - 使用静态
Ed25519
密钥或3XDH
. 进行身份验证
总的来说,强大的 E2E 消息传递系统很难设计。如果您使用此自制解决方案来应对严重的威胁模型,请谨慎行事。
请阅读,但如果您还有其他问题,请随时在下方提问。我很乐意用简单的语言提供更多详细信息。