7

一种基于DH算法的多方通讯加密的协议设计

 1 year ago
source link: https://juejin.cn/post/7181790762881941560
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一种基于DH算法的多方通讯加密的协议设计

2022年12月27日 11:37 ·  阅读 943

我们来自字节跳动飞书商业应用研发部(Lark Business Applications),目前我们在北京、深圳、上海、武汉、杭州、成都、广州、三亚都设立了办公区域。我们关注的产品领域主要在企业经验管理软件上,包括飞书 OKR、飞书绩效、飞书招聘、飞书人事等 HCM 领域系统,也包括飞书审批、OA、法务、财务、采购、差旅与报销等系统。欢迎各位加入我们。

本文作者:飞书商业应用研发部 韩卫灵

欢迎大家关注飞书技术,每周定期更新飞书技术团队技术干货内容,想看什么内容,欢迎大家评论区留言~

在几年前,笔者曾经从事过一段时间的区块链研究工作,包括联盟区块链和公有区块链。这里可以简单介绍一下,联盟区块链以 Hyperledger、Corda等,主要用于构建企业间互信环境,构成有限节点的联盟。公有区块链以btc,ETH,zcash等公开的p2p网络。其中就涉及到了众多的协议和算法。研究过包括PBFT(拜占庭 算法)、椭圆曲线加密算法、RSA加密算法、Diff-Hellman 加密算法,SSL加密算法等一系列的协议 。抛开其中基于数字货币的一些资金盘(杀猪盘),我一直认为区块链一直是一个非常好的学习研究的材料。本文也是基于其中的协议由感而发,如何实现一个去中心化的加密协议去保证群体信息交换的安全性。

为什么要加密

在互联网环境下,信息交换的同时也面临着信息泄露的风险 ,主要可以按以下问题分类

  • 内容窃取(比较隐私的个人或者群体的信息被泄露)
  • 内容篡改(信息交换的内容失真)
  • 内容伪造(利用他人的身份发布信息)

常用的攻击手段

  • 中间人攻击(DNS劫持)

在信息交换的流程中,密码学能解决信息安全的三个作用

  1. 加密:防止坏人获取你的数据;
  2. 认证:防止坏人修改了你的数据而你却并没有发现
  3. 鉴权:防止坏人假冒你的身份

一个完整的信息交换加密流程如下:

发送方输入明文 -> 加密 -> 生成密文 -> 传输密文 -> 接收方解密 -> 得到明文

Diff-Hellman加密协议介绍

一些经典的的加密通讯协议都是基于Diff-Hellman加密算法来建立的,包括咱们熟知的https协议和 SSL协议。简单介绍一下,DH加密算法的流程吧。假设Alice 和Bob 希望把他们之前的通信内容加密,但是又不能直接传递密钥,那这个时候DH算法就发挥作用了,可以通过这种密文交换 的方式算出一个对称加密的密钥

在diff-hellman 的论文中 证明了一个定理 : 假设有函数f(x),其中p 是一个足够大的素数,g 为一个常数 ,x为一个随机整数

image.png

image.png

以下的密钥交换的方式的依据就是这个定理。

UML 图.jpg

多方通讯加密协议

现有的最为人知的加密通讯工具恐怕就属 telegram 为首了,但是具体telegram 的通讯协议的实现原理笔者找了很久也只看到了单聊加密是如何实现的。那么在不可信网络中,如何能够去中心化的实现群体信息交换加密呢? 基于这个问题,笔者也思考了很久,想想能不基于DH 协议实现一个群聊的加密协议呢?

UML 图 (1).jpg

假设有这样一个群体,把这个群体看作是一个集合

image.png

在没有中心化节点的情况下,一条信息如何在这个群体中传递,而且只能这个群体中的一员来解密这些信息。

我们先来介绍两个概念。

  1. 在密码学中如何证明一句话是你说的,而不是别人?

公私钥加密体系 给每一个主体都有一个私钥,私钥加密的信息公钥可以解出,而公钥加密的信息只 有私钥能解出,这样就有了公私钥签名验证的说法。

  1. DH 协议一直用于两端的通讯加密,如何实现多端的加密?

DH协议的本质是基于密钥交换,那么能不能经过 n-1次 密钥 交换换取一个群聊加密的key,其实经过Diff-Hellman 证明过程可以扩展一下 ,对于任意 大整数

image.png

image.png

所以这样看起来需要经过 n 次的密钥 交换得到最终的密钥。

假设现在有3方需要构建一个加密渠道 ,密钥协商流程可以简化成以下步骤:

第一步,生成DH公钥,初始密钥,k1,k2,k3 为各自节点持有且不能被泄露

image.png

第二步,计算过程密钥,计算并发送到其它各个节点

image.png

第三步,计算过程密钥,并发送到其它各个节点

image.png

第四步,各节点合成最终的对称密钥

image.png

以上步骤都能保证不泄露原始的密钥 k1,k2,k3 最后计算出对称加密密钥 K

UML 图 (2).jpg

注: 以上每一次对外发送数据时都需要 对应节点的私钥签名 sign,以上的通信都是由server 端代完成的。

我们可以用数学归纳法来看这个问题:如果现在有n个节点参与密聊,那么总共会经历  n 轮的密钥交换 ,每个节点在收到其它节点发送过来的消息后,都会将自己的 [交换密钥] 加入计算后的结果发出,直到所有的密钥已经汇聚完成。如下所示

第一轮密钥计算:

image.png

第二轮密钥计算

image.png

第n-1 轮密钥计算

image.png

最后一轮计算就得到了最终的对称加密的密钥 K

笔者针对这种协议方式 ,实现了一个简易IM ,以下是开了4个客户端验证的结果 ,理论上可以开到n个客户端 。

80dcb40b993c4ab0b9278f6e4654a1ba~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image

安全性思考:

这种将DH协议作为一个变种的使用方式理论上会有比原生的安全问题出现吗?其实我们需要建立一个假设,就是在这个群体中是绝对可靠的,没有节点会有泄密的情况发生。这种方式简化下来就是 其实破解n 节点加密内容 和 破解两个节点的加密内容是一样的。我们可以在加密算法的选择上做更多的安全加固。比如用椭圆曲线(ECC)签名算法来代替 RSA签名算法,中本聪从一开始设计 btc的时候就已经想好了将来量子计算机普及,比特币的加密算法如何防量子攻击。

本篇文章算是一个单点思考并加以发散,只是几年前在深入研究了各种区块链的原理后由感而发,算是一个发散型的应用落地的思考吧。个人感觉这是一个比较有趣项目而自己恰好又喜欢学以致用,比较喜欢追求朴素实用的东西。

参考文献:

【 Diffie-Hellman】Key Exchange and Public Key Cryptosystems

【PBFT】拜占庭将军问题


扫码发现职位 & 投递简历:

image.png

官网投递:job.toutiao.com/s/FyL7DRg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK