实现端到端加密通信理论思路

实现端到端加密通信理论思路

实现背景

在日常生活中,如果双方的通信交流必须事先经过加解然后传输的,否则将会面临被他人监听的可能。接收方在接收到到信息时也会解密得到原始信息。
这就是端到端加密通信的大体思路,但是如何安全可靠的传输密钥就成为了解决问题的难点。

方法分析

如何解决密钥安全传输呢? 使用非对称加密方式
非对称加密方式一般使用两种方式:
第一种是使用RSA或者ECC为主的,公钥加密私钥解密的方式。
第二种是使用DH,X3DH为主的,确定一个“协商密钥”的方式。通信双方无需事先沟通,在不安全的网络中确定一个“协商密钥”。这个密钥可以在后续双方通信中作为对称密钥来加密信息内容。

共享密钥

预备知识

欧拉函数

就是对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 。

原根

设m为正整数,a为整数,a模m的阶等于φ(m),则称a为模m的一个原根。

HMAC

HMAC是基于散列的消息认证码。
将原始消息通过信息摘要算法计算得到HASH值之后再通过密钥加密得到MAC

DH密钥交换算法

共享密钥离不开DH算法,DH算法的实现流程如下:

设置两个公开的参数,一个素数q和一个整数a,a是q的一个原根

如果用户A和B想要交换密钥
则用户A生成一个随机数XA作为私钥,并计算YA=a^XAmodq。将私钥保存,公钥可以公开被其他人获取。
用户B也类似,生成一个随机数XB作为私钥,并计算YB=b^XBmodq。将私钥保存,公钥可以公开被其他人获取

用户A将得到的YB保存,并计算共享密钥K1=((YB)^XA)modq。
用户B将得到的YA保存,并计算共享密钥K2=((YA)^XB)modq。
通过推导,K1==K2(K1与K2相等),推导过程略

双方通过共享密钥进行加密或者解密进行通信。

DH密钥交换算法安全性分析

只要用户A和用户B的XA和XB不被泄露(XA和XB为用户私钥,原则上不公开也不分享),任何一个监听者能够获取到的信息只有q,a,YA,YB。要想获得共享密钥,必须计算XA或者XB,然后使用用户A或者用户B计算共享密钥的方式来计算共享密钥。

DH密钥交换算法,属于单项陷门函数,计算一个以素数为模的指数相对容易,但是计算离散对数却很困难,对于一个大的素数,计算出离散对数基本上不可能。

端到端加密共享密钥优点

  1. 使用RSA,ECC等公钥加密私钥解密的方式传输密钥,需要使用到完整的密钥分发系统,如果在分发的任何一个环节有错误,都无法进行通信。而共享密钥只需要对方的公钥,就可以生成共享密钥。不一定要对方在线
  2. 使用RSA,ECC等公钥加密私钥解密的方式传输密钥,如果临时会话密钥丢失,则需要重新生成临时会话密钥。而共享密钥则无需重新协商。
  3. 可以延展到多人之间共同协商出相同密钥,满足多人群聊沟通的需求。

端到端加密设计方案

基础方案

基于DH算法,首先设计一个简单的端到端加密的过程。

  1. 用户A在首次注册时,会基于服务器公开的两个全局的参数,生成DH公钥和私钥。
  2. 然后用户A将DH公钥发送到服务器,服务器保存DH公钥,并与用户A关联。用户A将私钥保存在本地。
  3. 用户A首次给对方发送信息或首次接受到对方信息时,便到服务器获取对方公钥。
  4. 用户A根据对方公钥和自己私钥计算出共享密钥K。
  5. 后续发送信息和接收信息都根据共享密钥K来进行加解密。

改进优化

HMAC

额外加入一个密钥,使用不同的密钥得到不同的MAC。这个额外的密钥需要通信双方的都知道。

前向安全

使用一次一密,引入一个HASH算法。这个算法可以通过输入一个密钥导出另一个离散性更大的密钥。这样监听者就算得知了某次的密钥,也无法推算出之前的密钥。

双棘轮(之后详细再说)
X3DH

X3DH,即DH的三倍扩展版
每个用户都需要创建三种密钥对,并将公钥上传到服务器:

  1. 身份密钥对(Identity key pair):一个长期符合DH协议的密钥对,用户注册时创建,与用户身份绑定;
  2. 已签名的预共享密钥(Signed Pre
    Key):一个中期符合DH协议的密钥对,用户注册时创建,由身份密钥签名,并定期进行轮换,此密钥是保护身份密钥不被泄露;
  3. 一次性预共享密钥(One-Time Pre Keys):一次性使用的Curve25519密钥队列,安装时生成,不足时补充。

假如用户A要和用户B通信,实现要和B确定消息密钥

  1. A创建一个临时密钥对,设为EPK-A;
  2. A从服务器获取B的三种密钥对的公钥:身份密钥对IPK-B;已签名的预共享密钥SPK-B;一次性预共享密钥OPK-B;
  3. A使用DH协议计算协商密钥: DH1 = DH(IPK-A,SPK-B) ;DH2 = DH(EPK-A,IPK-B) ;DH3 =
    DH(EPK-A,SPK-B) ;DH4 = DH(IPK-A,OPK-B) ;DH = DH1 + DH2 + DH3 + DH4(“+”代表拼接);
  4. 消息密钥S = KDF(DH);
  5. A使用消息密钥S对IPK-A和EPK-A发送给B;
  6. B接收到消息后计算得到S;
  7. A和B使用S进行加密通讯。

端到端端到端加密完成

至此完成Signal Protocol中最核心的算法且基本上满足了安全性,但是我们日常的处理过程会更加复杂且安全。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R丿清风不解语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值