概述
实现端到端加密通信理论思路
实现背景
在日常生活中,如果双方的通信交流必须事先经过加解然后传输的,否则将会面临被他人监听的可能。接收方在接收到到信息时也会解密得到原始信息。
这就是端到端加密通信的大体思路,但是如何安全可靠的传输密钥就成为了解决问题的难点。
方法分析
如何解决密钥安全传输呢? 使用非对称加密方式!
非对称加密方式一般使用两种方式:
第一种是使用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密钥交换算法,属于单项陷门函数,计算一个以素数为模的指数相对容易,但是计算离散对数却很困难,对于一个大的素数,计算出离散对数基本上不可能。
端到端加密共享密钥优点
- 使用RSA,ECC等公钥加密私钥解密的方式传输密钥,需要使用到完整的密钥分发系统,如果在分发的任何一个环节有错误,都无法进行通信。而共享密钥只需要对方的公钥,就可以生成共享密钥。不一定要对方在线。
- 使用RSA,ECC等公钥加密私钥解密的方式传输密钥,如果临时会话密钥丢失,则需要重新生成临时会话密钥。而共享密钥则无需重新协商。
- 可以延展到多人之间共同协商出相同密钥,满足多人群聊沟通的需求。
端到端加密设计方案
基础方案
基于DH算法,首先设计一个简单的端到端加密的过程。
- 用户A在首次注册时,会基于服务器公开的两个全局的参数,生成DH公钥和私钥。
- 然后用户A将DH公钥发送到服务器,服务器保存DH公钥,并与用户A关联。用户A将私钥保存在本地。
- 用户A首次给对方发送信息或首次接受到对方信息时,便到服务器获取对方公钥。
- 用户A根据对方公钥和自己私钥计算出共享密钥K。
- 后续发送信息和接收信息都根据共享密钥K来进行加解密。
改进优化
HMAC
额外加入一个密钥,使用不同的密钥得到不同的MAC。这个额外的密钥需要通信双方的都知道。
前向安全
使用一次一密,引入一个HASH算法。这个算法可以通过输入一个密钥导出另一个离散性更大的密钥。这样监听者就算得知了某次的密钥,也无法推算出之前的密钥。
双棘轮(之后详细再说)
X3DH
X3DH,即DH的三倍扩展版
每个用户都需要创建三种密钥对,并将公钥上传到服务器:
- 身份密钥对(Identity key pair):一个长期符合DH协议的密钥对,用户注册时创建,与用户身份绑定;
- 已签名的预共享密钥(Signed Pre
Key):一个中期符合DH协议的密钥对,用户注册时创建,由身份密钥签名,并定期进行轮换,此密钥是保护身份密钥不被泄露; - 一次性预共享密钥(One-Time Pre Keys):一次性使用的Curve25519密钥队列,安装时生成,不足时补充。
假如用户A要和用户B通信,实现要和B确定消息密钥
- A创建一个临时密钥对,设为EPK-A;
- A从服务器获取B的三种密钥对的公钥:身份密钥对IPK-B;已签名的预共享密钥SPK-B;一次性预共享密钥OPK-B;
- 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(“+”代表拼接); - 消息密钥S = KDF(DH);
- A使用消息密钥S对IPK-A和EPK-A发送给B;
- B接收到消息后计算得到S;
- A和B使用S进行加密通讯。
端到端端到端加密完成
至此完成Signal Protocol中最核心的算法且基本上满足了安全性,但是我们日常的处理过程会更加复杂且安全。
最后
以上就是等待棉花糖为你收集整理的实现端到端加密通信理论思路实现端到端加密通信理论思路的全部内容,希望文章能够帮你解决实现端到端加密通信理论思路实现端到端加密通信理论思路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复