首页 > 编程语言 >Diffie-Hellman密钥交换算法

Diffie-Hellman密钥交换算法

时间:2023-04-21 16:04:04浏览次数:41  
标签:Hellman text 复杂度 算法 密钥 Diffie 私钥 mod

目录
隐私计算常用到各种加密算法,那么双方如何协商得到同一个不被泄露的密钥呢?
一种做法是基于RSA,拥有公钥的一方将随机私钥加密提供给对方,对方再利用私钥解密出密钥。于是双方都得到了会话密钥。
上面这种基于非对称加密的方法是SSL 最古老的密钥协商方式,早期的 SSLv2 只支持这种密钥协商机制。
本篇是另一种密钥交换算法,可以保证“通讯双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥”:DH 算法,全称Diffie-Hellman算法。

前置知识

定义 \(a\) 在模 \(m\) 下的是同余方程 \(a^x \equiv 1 \mod m\)的最小正整数解,即为 \(\text{ord}_m a\)。

根据欧拉定理,\(a\),\(m\) 互质情况下,上述方程一定有解,其中一个解为 \(\phi(m)\)。 \(\text{ord}_m a\)。一定为 \(\phi(m)\) 的因数。

原根

当 \(\text{ord}_m a=phi(m)\) 时,就称 \(a\) 为模 \(m\) 下的一个原根

对于原根a,\(a^1, a^2, \cdots, a^{\phi(m)}\) 在模 \(m\) 下各不相同。

正整数有原根的充要条件为:它能表示为下列形式之一: \(2,4,p^n,2p^n\),其中 p 为奇素数。

离散对数

离散对数可以看作模p下指数运算的逆运算。

对于一个整数 b 和素数 p 的一个原根 a ,可以找到惟一的指数 i ,使得 \(b=a^i \mod p\) ,其中 \(0\le i\le p-1\),指数 i 称为 b 的以 a 为基数的模 p 的离散对数,该值被记为 \(\text{ind}_{a,p}(b)\) 。

密钥交换算法

算法原理

1)A、B双方共享两个公开的参数,素数p和整数a,其中a是p的原根。

2)A产生私钥随机数 \(X_A\) (<p),公开 \(Y_A = a^{X_A} \mod p\)

3)B产生私钥随机数 \(X_B\) (<p),公开 \(Y_B = a^{X_B} \mod p\)

4)共享秘密密钥:

  • A: \(K = Y_B ^{X_A} \mod p\)

  • B: \(K = Y_A ^{X_B} \mod p\)

  • 可以验证,双方交换一个相同的秘密密钥 K

    \[Y_B ^{X_A} = a^{X_A X_B}= Y_A^{X_B} \mod p \]

安全性

敌对方可以利用的参数只有 \(a, p, Y_A, Y_B\),要获取得到私钥,必须通过计算离散对数来确定密钥。

  • 对于A,想求出B的私钥:

    \(X_B = \text{ind} _{a,p}(Y_B)\)

  • 对于B,想求出A的私钥:

    \(X_A = \text{ind} _{a,p}(Y_A)\)

Diffie-Hellman密钥交换算法的安全性依赖于计算离散对数的难度。暴力破解的时间复杂度是 \(O(p)\),而Baby-step Giant-step的时间复杂度是\(O(\sqrt p)\)。这里复杂度实际上是指数增长的,我们设 \(n\) 为素数 \(p\) 的二进制位数,那么目前最优算法破解复杂度为 \(O(2^{n/2})\) 。

Baby-step Giant-step算法

给定素数p导出的有限循环群\(\{g^0, g^1, \cdots, g^q\}\),已知\(a=g^k\mod p\),求k。

  1. 令 \(m=\sqrt {p−1}\),令 \(k=im+j\),其中 \(i, j \in \{0,1,...,m-1\}\).
  2. 由于\(a=g^k=g^{im+j}\mod p\), 从而\(g^j=ag^{−im}\mod p\).
  3. 遍历所有可能的 \(i,j\),找到符合\(g^j=ag^{−im}\mod p\) ,则找到 \(k=im+j\).
  4. 计算分为两部分
  • Giant steps:对所有\(i \in \{1,2,...,m-1\}\),计算\(ag^{−im}(\text{mod } p)\),保存到表格。
  • Baby steps:查表,并对所有 \(j \in \{1,2,...,m-1\}\),计算\(g^j(\text{mod } p)\),直到符合条件。
  • 时间复杂度: \(\sqrt p\)个步骤计算表格, 平均\(0.5\sqrt p\)个步骤寻找 j,一共是 \(1.5\sqrt p\)个步骤。

这里的根号复杂度算法可以看作的整数分块应用。其中 p-1 为 p的欧拉函数值\(\phi(p)=p-1\),m 为 p-1的二次剩余,即为模意义下的开跟运算。通过分块,将枚举空间长度从线性减少到了根号区间。

标签:Hellman,text,复杂度,算法,密钥,Diffie,私钥,mod
From: https://www.cnblogs.com/izcat/p/17340688.html

相关文章

  • 密钥管理说明
    密钥,一般泛指生产、生活所应用到的各种加密技术,加密密钥的安全性对其保护的数据的机密性至关重要。有权访问密钥的危险参与者可以读取敏感数据,甚至可能为虚假或修改的记录生成有效签名。通常情况下,客户通常遵循阻力最小的路径,并不总是了解如何安全地创建、存储和访问密钥。当密码和......
  • 量子密钥分发光网络-仿真研究
    1.获取拉满散射噪声系数谱。从一个曲线图上获取每个点的具体数据-小工具:(注册免费使用21天)http://www.getdata-graph-digitizer.com/registration.php......
  • 计算机系统 ( 计算机硬件基础 )刷题——密钥
                                                                               ......
  • 解决 ssh 找不到对应主机密钥类型
    解决办法如果最近升级到了openssh8.8版,你会发现连接某些之前连接得好好的服务器突然无法连接:Unabletonegotiatewithx.x.x.xport2222:nomatchinghostkeytyp......
  • git密钥添加及验证
    概述由于特殊原因删除了window.ssh/known_hosts,在通过vscodepush代码是提示异常,因为第一次需要人工yes确认的主机秘钥,蛋疼的操作开干envwindow11gitx01、生成ssh......
  • 计算机网络系统方法:密钥的分配
    为了使用密码器和认证器,交流的参与者需要知道使用什么密钥。在秘密钥匙密码的情况下,一对参与者如何获得他们共享的钥匙?在公钥密码的情况下,参与者如何知道哪个公钥属于某个......
  • sourcetree提示ssh密钥认证失败
    今天使用sourcetree推送,麻烦来了,推送不了  解决方法:修改SSH客户端配置【工具】-【选项】-【一般】,将默认的SSH客户端-PuTTY/Plink改为OpenSSH,把它选择为OpenSSHSS......
  • Git添加SSH密钥步骤
    1、先去本机上面看看用户主目录里面有没有.ssh这个文件夹如果有的话,再看看该目录下有没有id_rsa和id_rsa_pub这两个文件:若还是有,就直接跳过这一步到下一步;若是没有,我们......
  • 使用EC2 Userdata为丢失密钥的EC2更换密码
    EC2实例-使用Shell脚本和cloud-init指令组合使用免密钥登录Content-Type:multipart/mixed;boundary="//"MIME-Version:1.0--//Content-Type:text/cloud-confi......
  • esxi8.0测试密钥
    esxi8.0测试密钥VMwarevSphereESXi8.0ESXi8:4V492-44210-48830-931GK-2PRJ4VCSA8:0Z20K-07JEH-08030-908EP-1CUK4ESXi8:4F40H-4ML1K-M89U0-0C2N4-1AKL4VCSA8:0F41K-0MJ......