You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双端加密通信疑问:如何让收发双方均可解密同一份数据?

点对点加密消息应用:发件人自解密方案解决思路

你的初始思路本身没问题,但确实只满足了收件人解密的需求,发件人因为没有收件人私钥,无法解密自己发送的消息——这是因为你只生成了针对收件人公钥的密钥信封,没有考虑发件人自身的解密需求。

以下是两种符合你要求的可行实现方案:

方案一:双密钥信封加密

这是最直接的改造方案,核心是给同一个AES会话密钥生成两个加密信封:

  • 生成随机的AES-256-GCM会话密钥(推荐用GCM模式,自带完整性校验),用它加密消息明文
  • 分别用发件人公钥和收件人公钥加密这个AES会话密钥,得到两个加密后的密钥段(需标记清楚哪个对应发件人、哪个对应收件人)
  • 将「加密后的消息体 + 发件人公钥加密的密钥段 + 收件人公钥加密的密钥段」打包后上传服务器
  • 当发件人拉取消息时,用自己的私钥解密对应的密钥段,得到AES会话密钥进而解密消息体;收件人同理用自己的私钥解密对应的密钥段即可

这个方案完全符合你的要求:服务器只存密文和加密后的密钥段,无法解密;双方本地不存明文,仅通过各自私钥解密临时会话密钥。

方案二:ECDH共享密钥衍生方案

利用椭圆曲线密钥交换(ECDH)的特性,双方可以基于各自的长期密钥对生成相同的共享密钥,进而衍生出会话密钥:

  • 双方各自生成长期EC密钥对(私钥安全存储在系统密钥容器,比如苹果Keychain,公钥可以上传服务器或互相交换)
  • 每次发消息时,生成随机AES会话密钥加密明文
  • 发件人用自己的长期私钥 + 收件人的长期公钥,通过ECDH计算出共享密钥SK
  • 用SK加密AES会话密钥,得到加密后的密钥包,和密文一起上传服务器
  • 无论是发件人还是收件人,都能通过「自己的私钥 + 对方的公钥」计算出同一个SK,从而解密出AES会话密钥,进而解密密文

这个方案的优势是不需要存储两个密钥段,只需要一个加密后的密钥包即可;但需要提前完成双方公钥的交换和验证(防止中间人替换公钥)。

关键注意事项

  • 所有私钥必须存储在系统提供的安全容器中(如Keychain/Keystore),绝对不能明文存储或硬编码
  • 每次消息使用独立的随机AES密钥,避免单个密钥泄露影响所有历史消息
  • 优先选择AEAD加密模式(如AES-GCM、ChaCha20-Poly1305),同时提供加密和完整性校验,防止消息被篡改
  • 公钥交换时必须进行身份验证,比如通过可信渠道验证对方公钥的指纹,避免第三方Mallory替换公钥发起中间人攻击

内容的提问来源于stack exchange,提问作者sudoExclamationExclamation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 22:53:32