DH算法原理

article/2025/10/2 3:37:10

 

DH算法原理

 

 

 

DH 是 Diffie-Hellman的首字母缩写,是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。我个人倾向于称DH算法为 密钥协商协议而RSA算法是密钥交换算法。

 

本篇分为几个部分,第一个部分介绍一下密钥交换的场景;第二部分介绍一下DH算法的的步骤,以及由该算法引出的一些问题;第三部分开始讲数学原理。数学原理可能涉及到数论、抽象代数,本篇尽量在每个公式后面证明该公式的正确性。

 

 

简单场景&简单的密钥协商

先从一个应用场景说起:
Alice 和Bob想要在一个不安全的信道共享一个密钥,该密钥可被用来进行后续的其他的操作,并且仅被Alice和Bob所知,第三方无法得知。
一个简单的方法就是,现在全世界都是知道一个值 P=100。Alice生成随机值5,然后乘上P,接着发送Pa = 500给Bob;通样Bob生成随机值6,然后乘上P,接着发送Pb = 600给Alice。
这样,Alice 有 100,5 ,600,Bob有100,6,500。

Alice计算: 随机值5(自己私钥) * 600(对端的公钥) = 3000 等式1
Bob计算 : 随机值6(自己私钥) * 500(对端的公钥) = 3000 等式2


    这样 Alice就和Bob共享了一个值3000,还有谁知道3000这个值呢?我们知道Alice明文的将500发送到不安全信道,Bob明文的将600发送到不安全信道,这也就意味着第三方仅仅知道500 和 600,想要计算获得共享密钥,第三方要么获取到Alice的随机值然后拿它乘上600,要么获取到Bob的随机值然后拿它乘上500,这样才能获取到Alice和Bob的共享密钥。


    问题来了,如何获取到Alice的随机值呢?

    第三方知道,Alice发送的500是由P乘上Alice的随机值得到的,所以问题变成了求方程 x*100 = 500的解。一眼就能看出来,Alice的随机值是5。


上述方法很容易被破解的原因是P太简单了。P值再复杂点怎么样?


例如P = 0x123456781234567812345678
Pa  = 0xAD77D73E0BFC0E3E0BFC0E3D5E84370
Pb  = 0x4EF81E05A6A0F385A6A0F38557A8D58
显然,你不能一眼就求出方程 x*P = Pa 的解


    其实 Alice的随机数为 0x98765432, Bob的随机数为0x45681265。
但是这一切对于计算机来说还是太简单了。例如OpenSSL、Mbedtls等众多的开源库都提供了大数运算的API,计算Pa/P可能就几毫秒甚至几微秒的事情。


    所以怎么要让中间人难以从Pa或者Pb中分解得到Alice或Bob的随机数,而Alice和Bob又能轻松的通过P和随机数计算得到Pa和Pb,就成了设计这个算法的关键。从上面的例子可以看出,简单的乘法运算是不行的。
    一般来说上述所说的全世界都知道的值P称之为公钥,为Alice和Bob的随机数称之为私钥。

 

 

DH算法的一个例子

 

 

 

 

这里举例一个DH算法的例子。

 

例1:

设有这么一个二元组 (q, p) = (3, 7)

 

我们定义Alice和Bob这么一个运算:

 

(1)Alice 选择一个范围在[1, p-1]的随机数,为da= 5

(2)Alice 计算Pa = q^da mod p = 3^5 mod 7 = 5

(3)Bob选择一个范围在[1, p-1]的随机数,为db = 6

(4)Bob计算Pb = q^db mod p = 3^6 mod 7 = 1

(5)Alice和Bob交换Pa和Pb

(6)Alice计算共享密钥S = Pb ^da mod p = 1^5 mod 7 = 1

(7)Bob计算共享密钥S = Pa ^db mod p = 5^6 m 7 = 1

 

    至此,Alice和Bob能够共享一个密钥为1。中间人由于只得到了Pa=5和Pb=1,如果也想要得到S,要么获取da然后执行步骤6中的等式计算得到结果、要么获取db然后执行步骤7中的等式得到结果。而要知道da或者db,需要计算

 

    其实该算法的原理和上一部分中简单乘法及其类似,只是获取da或者db不是简单的方程式了,而是涉及到对数运算。对数运算被认为是“难”的,这个难建立在目前为止没有找到一个快速计算对数的算法,数学上没有证明这个算法是否存在。

 

    看到这肯定有一个问题,随便一个二元组(q, p)都可以参与运算吗?显然不行。

我们来看看如果随便一个(q, p)参与运算,会出现什么情况。

 

例2:

假设(q, p) = (7,15),我们让Alice和Bob再来协商一遍

 

(1)Alice 选择一个范围在[1, p-1]的随机数,为da= 3

(2)Alice 计算Pa = q^da mod p =7^3 mod 15 = 13

(3)Bob选择一个范围在[1, p-1]的随机数,为db = 2

(4)Bob计算Pb = q^db mod p = 7^2 mod 15 = 4

(5)Alice和Bob交换Pa和Pb

(6)Alice计算共享密钥S = Pb ^da mod p = 4^3 mod 15 = 4

(7)Bob计算共享密钥S = Pa ^db mod p = 13^2 mod 15 = 4

 

 

看起来还是协商成功了,那问题在哪?

7^x mod 15:

7^1 mod 15 = 7

7^2 mod 15 = 4

7^3 mod 15 = 13

7^4 mod 15 = 1

7^5 mod 15 = 7

7^6 mod 15 = 4

7^7 mod 15 = 13

7^7 mod 15 = 1

......

 

 

    看到规律了吗?7^x mod 15的结果一共才4种,并且周期循环。

这也就意味着中间人获取到了Pb = 4,中间人不一定需要知道Alice原始的随机值(私钥)是什么,只要在[1 , 14]中随便选择一个满足7^x mod 15 = 13的值进行计算S = 4^7 mod 15 = 4^11 mod 15 = 4 都能正确计算共享密钥。换句话说,中间人不需要暴力遍历[1 , 14]中的所有数就能计算共享密钥。

 

    所以我们选择(b, p)的原则就是,G = b^x mod p,

当x遍历[1, p -1]时,G也遍历了一遍[1, p -1],这样中间人即使暴力破解,在P很大的时候,暴力破解是非常难的。

 

 

 

 

DH背后的数学&DH算法证明

 

 

设 已知 二元组(q, p)

Alice 生成随机值a,计算q^a mod p = Ga

Bob  生成随机值b, 计算q^b mod p = Gb

 

Alice 计算Sa =Gb^a mod p

Bob 计算Sb = Ga^b mod p

 

 

 

我们需要证明Sa=Sb

 

 

 

Sa = Gb^a mod p

     = (q^b mod p)^a mod p

 

 

令q^b mod p = T,则q^b = kp + T,也即T = q^b - kp

Sa = (q^b mod p)^a mod p

= (T)^a mod p

=(q^b - kp)^a mod p

 

    由于对 (q^b - kp)^a展开,除了第一项为q^(ab)以及最后一项为(kp)^a,其余每一

项均存在p,所以计算(q^b - kp)^a mod p之后,只保留了第一项,即Sa = q^(ab) mod p

 

同理可正Sb = q^(ba) mod p = Sa

 

 

 

 

原根

 

    我们在上一节例二中讲到,我们选择的(q, p)尽可能的使得当x遍历[1, p -1]时,

b^x mod p也遍历了一遍[1, p -1]。我们就来介绍一下原根。

 

 

 

定义1:

当 m > 1, gcd(a, m) = 1,则使得 a^e mod m = 1成立的最小正整数e称作整数a

对模m的阶(或指数、乘法周期),记做ord(a)。若a的阶

,

a称作为模m的原根。

 

 

 

 

例二中,7模15的阶是4。

那15有原根吗? 显然,根据定义,找出所有和15互素的数,然后计算他们的

阶,阶无一例外均不是,故15不存在原根。

 

现在我们来看看原根的另一个定理,这个定理对于我们找打合适的(q, p)很重要。

 

 

 

定理1:

设m>1,gcd(a,m) = 1,则

a^0, a^1, a^2, ... a^ord(a)-1 模m两两不同余。

 

 

 

证明:反证法

如若存在K,L(L<K<ord(a)) 使得

a^K = a^L mod m

由于gcd (a , m)=1,即存在a的逆a^-1,故等式两边乘上a^(-L)

a^(k-l) = 1 mod m

即存在k-l,使得a^(k-l) = 1 mod m等式成立,而k-l < ord(a),与阶的定义矛盾。故假设不成立。

 

定理1中a和m的关系,我们就可以用来当做DH算法中的(q,p)。

 

 

 

RFC 3526 中给出了推荐的DH参数。

 

如果绝对对你有用,请打赏5元 http://39.98.242.44

 

 

 

 

 

 

 


http://chatgpt.dhexx.cn/article/ZaHhoooh.shtml

相关文章

DH、DHE、ECDHE加密算法

DH算法 离散对数 DH 算法是非对称加密算法&#xff0c; 因此它可以用于密钥交换&#xff0c;该算法的核心数学思想是离散对数。 对数运算&#xff1a; i l o g a b i log_{a}b iloga​b 离散对数是在对数运算的基础上加了「模运算」&#xff0c;也就说取余数&#xff0c;…

DH 算法原理

一、DH算法 DH 算法其实也叫作 Diffie - Hellman 密钥交换协议&#xff0c;是一个不安全的秘钥共享网络协议&#xff0c;无法避免中间人攻击。 二、DH算法的原理 假设 Ali 和 Bob 需要互相通信并共享秘钥 Ali 先给 Bob 一个明文共享参数 、 &#xff0c;此信息可以被任何人…

DH算法图解+数学证明

前几天和同事讨论IKE密钥交换流程时&#xff0c;提到了Diffie-Hellman交换。DH算法最主要的作用便是在不安全的网络上成功公共密钥(并未传输真实密钥)。但由于对于DH算法的数学原理则不清楚&#xff0c;因此私下对DH算法进行一个简单学习。 1. DH算法的交互流程&#xff1a; Al…

卷积神经网络(Convolutional Neural Networks,CNNS/ConvNets)

本文翻译自 Convolutional Neural Networks(CNNs / ConvNets)&#xff0c;更多内容请访问&#xff1a;http://cs231n.github.io/。 原来译文&#xff1a;https://blog.csdn.net/Consu_Yasin/article/details/78052411 卷积神经网络非常类似于普通的神经网络&#xff1a;它们都…

卷积神经网络CNNs的理解与体会

孔子说过&#xff0c;温故而知新&#xff0c;时隔俩月再重看CNNs&#xff0c;当时不太了解的地方&#xff0c;又有了新的理解与体会&#xff0c;特此记录下来。文章图片及部分素材均来自网络&#xff0c;侵权请告知。 卷积神经网络&#xff08;Convolutinal Neural Networks&a…

Gated-SCNN: Gated Shape CNNs for Semantic Segmentation论文笔记

论文介绍 作者认为之前的semantic segmentation的工作将所有信息都放入到了CNN的网络之中(这其中包含了颜色、边界、纹理等信息)&#xff0c;这不太理想&#xff0c;所以作者在regular stream的基础之上增加了一个shape stream的分支&#xff0c;通过利用门控卷积来控制使得sh…

【t-SNE可视化CNNs特征向量-代码】

t-SNE可视化CNNs特征向量-代码 本博客主要是自己学习记录&#xff0c;参考网络&#xff0c;欢迎指正 整体代码 ModelPath是存放训练好的模型参数的路径 DatasetPath是存放数据集的文件夹的路径&#xff0c;其中不同类别放在不同的子文件夹里也可以参考【t-SNE可视化-代码】 …

CNNs: AlexNet补充

CNNs: AlexNet的补充 导言对AlexNet模型进行调整模型不同层的表征其他探索总结 导言 上上篇和上一篇我们详细地讲述了AlexNet的网络结构和不同超参数对同一数据集的不同实验现象。 本节&#xff0c;我们就AlexNet的一些其他相关问题进行解剖&#xff0c;如修改AlexNet参数量调…

深度学习-浅谈CNNs

偶尔看到了这篇文章&#xff0c;感觉作者写的很容易理解&#xff0c;对于初步认识CNNs有很大的帮助&#xff0c;若想查看原文&#xff0c;请点击此处。 关于神经网络的学习方法&#xff0c;总结起来的要点有以下几点&#xff1a; BP算法 激励函数正则化与交叉验证等其他防止过…

【GSCNN】GSCNN:Gated Shape CNNs for Semantic Segmentation论文记录

目录 简单不看版&#xff1a; 摘要 一、介绍 二、相关工作 三、Gated Shape CNN 代码 四、实验 五&#xff0e;总结 论文&#xff1a;https://arxiv.org/abs/1907.05740 代码&#xff1a;GitHub - nv-tlabs/GSCNN: Gated-Shape CNN for Semantic Segmentation (ICCV 2…

CNNs和视觉Transformer:分析与比较

探索视觉Transformer和卷积神经网络&#xff08;CNNs&#xff09;在图像分类任务中的有效性。 图像分类是计算机视觉中的关键任务&#xff0c;在工业、医学影像和农业等各个领域得到广泛应用。卷积神经网络&#xff08;CNNs&#xff09;是该领域的一项重大突破&#xff0c;被广…

你应该知道的9篇深度学习论文(CNNs 理解)

当时看到英文的博客&#xff0c;本想翻译给感兴趣的同学们看看&#xff0c;没想到已经有人翻译&#xff0c;于是进行了转载&#xff0c;留给自己和更多的人学习&#xff0c;本文仅供参考。 英文博客&#xff1a;https://adeshpande3.github.io/adeshpande3.github.io/The-9-Dee…

【神经网络】CNN

CNN工作原理笔记 卷积神经网络定义卷积运算池化激活函数全连接反向传播算法其他应用延伸知识 首先放个学习视频链接: 大白话讲解卷积神经网络工作原理. 卷积神经网络定义 CNN其实就相当于黑箱&#xff0c;有输入有输出 输入&#xff1a;二维像素阵列 输出&#xff1a;判决结果…

CNN+RNN

CNN,RNN(recurrent, 下同)结合到一起可以建立一个更好的model 1. CRNN&#xff08;先CNN&#xff0c;后RNN&#xff09; References: An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition 一般用于基…

CNNs: ZFNet之CNN的可视化网络介绍

CNNs: ZFNet之CNN的可视化网络介绍 导言Deconvnet1. Unpooling2. ReLU3. Transpose conv AlexNet网络修改AlexNet Deconv网络介绍特征可视化 导言 上一个内容&#xff0c;我们主要学习了AlexNet网络的实现、超参数对网络结果的影响以及网络中涉及到一些其他的知识点&#xff0…

吊炸天的CNNs,这是我见过最详尽的图解!(上)

导读&#xff1a;卷积神经网络&#xff08;CNNs&#xff09;在“自动驾驶”、“人脸识别”、“医疗影像诊断”等领域&#xff0c;都发挥着巨大的作用。这一无比强大的算法&#xff0c;唤起了很多人的好奇心。当阿尔法狗战胜了李世石和柯杰后&#xff0c;人们都在谈论“它”。但…

深度学习—CNN

CNN简介 卷积神经网络 – CNN 最擅长的就是图片的处理。它受到人类视觉神经系统的启发。 CNN 有2大特点&#xff1a; 能够有效的将大数据量的图片降维成小数据量能够有效的保留图片特征&#xff0c;符合图片处理的原则 目前 CNN 已经得到了广泛的应用&#xff0c;比如&…

吊炸天的CNNs,这是我见过最详尽的图解!(下)

【摘要】本文详细介绍了卷积神经网络的运行原理&#xff0c;特别是池化、全连接等过程。为了使大家更快、更轻松的入门&#xff0c;文章没有晦涩难懂的术语和公式&#xff0c;全部采用“图形”的方式来描述。文末的延展阅读部分&#xff0c;更加入了彩色图片卷积原理的手工演算…

CNNs:ZFNet之基于AlexNet特征可视化实验分析

CNNs:ZFNet之基于AlexNet特征可视化实验分析 导言基于AlexNet网络的实验分析实验一:不同卷积层特征提取分析实验二&#xff1a;不同卷积层提取特征收敛分析 ZFNet网络介绍基于ZFNet网络的实验分析实验三&#xff1a;针对AlexNet特征提取改善可视化实验四&#xff1a;特征不变性…

CNN详细学习

前馈神经网络 MLP&#xff1a;multi-layer percetron Feed Forward and Back error propagation解决异或划分问题 缺点&#xff1a; 容易过拟合容易陷入局部最优化梯度消失计算资源不充分&#xff0c;训练集小 DNN 深一点效果好&#xff0c;宽一点容易理解&#xff0c;发现…