【IERG4130学习笔记】Diffie-Hellman Key Exchange

news/2024/11/1 22:42:38/

/* Written by Edward

* BEng, CSE, Faculty of Engineering, CUHK

* 本人本科小菜鸟一个,如有遗漏,欢迎指出,互相学习,谢谢

*/

Diffie-Hellman Key exchange可以说是Public Key Infrastructure的开山始祖,虽说没有涉及到具体详细的算法,但是提供了一个非常好的方向,可以说ElGamal Encryption基本上完全就是直接套用了Diffle-Hellman的核心思想,更然后才有了RSA算法,更多的介绍您可以移步百度百科或者WIKI(WIKI上的介绍更详尽)。

简而言之,人们在通信时想要加密自己的信息,然而收信方往往需要预先与发信方有一个提前商量好的加密/解密方法,以及其相对应的密钥(key),但是在他们商量好加密/解密方法之前,他们的信息又是未加密的,怎么通过未加密的信息来传递关于加密/解密方法的信息(通常是协商确定key),避免在正式通信开始前就被敌方破解(知道key的值)呢? 这就是Diffie-Hellman Key Exchange解决的问题。


在这里小记一下自己对Diffie-Hellman Key exchange的理解

Pre-requisites:

1. 对群(group)有基本认知 (WIKI一下啦,反正我是自学的,上课时教授几页PPT就讲完了,不明觉厉啊)

2. 对Modular Arithmetic模运算有一定的认知(上课时教授几页PPT都没用就讲完了,完全不能支撑接下来的学习,于是我又WIKI了)

3. 对Diffille-Hellman Problem有一定认知

4. 对Discrete Logarithm Problem有一定的认知


那么接下来我大概简介一下3跟4、什么是Diffille-Hellman Problem,什么又是Discrete Logarithm Problem。

Diffile-Hellman Problem

这个问题说的是,如果你知道g的值、N的值、(g^x) mod N的值和(g^y) mod N的值,怎么算出(g^xy) mod N的值呢?

这被认为是一个很难解决的问题,您可以思考一下。

由于直接从(g^x) mod N和(g^y) mod N是很难算出(g^xy) mod N的值的,那么就有人开始考虑,是否可以先分别算出其中x跟y的值,然后直接去算出(g^xy) mod N的值呢?这就引申出了下面这个Discrete Logarithm Problem

Discrete Logarithm Problem

什么是Discrete Logarithm Problem呢?简单来说,就是你已知数字g、N和(g^x) mod N分别的值,但是你无法求出x的值。 

当然以上的解释是很不数学严谨的,但是直观上来讲大概就是这样的意思。这是由取模操作的特点造成的,我也无法给出具体的数学证明(毕竟数学差),但是我可以举几个例子

例如说,g = 3, N = 5, (g^x) mod N = 4

当然,你第一时间会想到x = 2啊!(3 ^ 2 = 9, 9 mod 5 = 4)

但是,很不幸的是,x = 5也行哦,x = 9也行哦,x = 13也行哦,晕了吧?往大一点,x = 28也行哦。


只要以上两个问题解决不了Diffie-Hellman Key Exchange就是不容易给攻破的(当然还有别的方法攻破)


Diffie-Hellman Key Exchange Procedure

Diffie-Hellman Key Exchange具体是怎么工作的呢?如下,设有两者A与B要进行KEY EXCHANGE

1. A选择一个g,一个N,一个x (A的secret key), 计算出X = (g^x) mod N,然后发送(g, N, X)给B

2. B收到(g, N, X),选择一个y (B的secret key),计算出Y = (g^y) mod N,并且把X^y = (g^x)^y mod N = (g^xy) mod N作为key,然后发送(Y)给A

3. A收到Y,计算Y^x = (g^y)^x mod N = (g^yx) mod N = (g^xy) mod N作为key,至此,A与B的key是相同的(g^xy) mod N。


就是以上三步那么简单。至此,A和B都共享同一个key = (g^xy) mod N可以用作今后通信的加密。


如果中间有一个黑客C,他窃听到了(g,N,X)和(Y),那么他可不可能知道key呢?

答案是否定的,基于Diffie-Hellman Problem跟Discrete Logarithm Problem,他既无法直接用X,Y算出key,也无法知道A与B分别的secret key x跟y,所以最后无法算出key的值。

总的来说,这种Key Exchange Protocol是安全的,但是也有许多局限性。


Man-in-the-Middle Attack (中间人攻击)

当然,由于A与B都没有验证信息(g,N,X)或者(Y)的来源,那么如果黑客C不仅仅可以窃听,还可以分别伪装成A和B跟另一方进行通信,那么这种Key Exchange就会被攻破了。


其他攻击

百度百科上还写道说此Key Exchange还容易受到重演攻击Replay Attack跟阻塞攻击(Congestion Attack? 私以为是一种Denial of Service),具体是什么情况我还得另外了解了解……



Reference:

[1]Bruce Schneier, Applied Crptography

[2]各种维基百科



http://www.ppmy.cn/news/221967.html

相关文章

【IERG4130学习笔记】DNS Spoofing via Birthday Attack

/* Written by Edawrd * BEng CSE department of CUHK, * 如有错漏,欢迎批评指出,本人只是本科小菜鸟一个 */ 注:以下内容是基于BIND (Berkeley Internet Name Domain) 域名服务的 最近在学一门cyber security的课&#xff…

自己搭建Nas(群晖 or TrueNas)

第一、还是要看自己的预算。 推荐600左右选择矿渣蜗牛星际A款4盘机箱,600以上推荐星际大陆M1和拓普龙8盘机箱。 蜗牛星际A款机箱,然后有sata背板的大概105左右,推荐淘宝,咸鱼现在很贵。 拓普龙新款大概是600左右,咸…

百练 4130 Saving Tang Monk [BFS+优先队列+状态压缩]

百练题目地址 判重3个状态就够了 位置钥匙 除了#位置&#xff0c;其他位置都可以经过多次 注意钥匙数可以为零 因为打蛇要time2&#xff0c;所以用优先队列 蛇的数量<5,所以1<<5的数就足够保存蛇的状态了 #include<iostream> #include<cstdio> #incl…

【BZOJ】4130: [PA2011]Kangaroos【KD树——最长连续1的子段长度】

传送门&#xff1a;【BZOJ】4130: [PA2011]Kangaroos【KD树】 题意&#xff1a;给出一个长度为 N(N≤5⋅104) 的区间序列。然后接下来 M(M≤2⋅105) 个询问&#xff0c;每个询问给出一个区间 [L,R] &#xff0c;问区间序列中最长的连续子序列长度&#xff0c;使得连续子序列中…

Rimini Street接到法院命令,将获得甲骨文2150万美元退款,还将寻求通过进一步上诉获得额外的4130万美元

法院宣布Rimini Street在与甲骨文直接维护服务合法竞争状态下提供第三方支持 拉斯维加斯--(美国商业资讯)--Rimini Street, Inc. (Nasdaq: RMNI)是企业软件产品和服务的全球供应商以及甲骨文和SAP软件产品的领先第三方支持提供商&#xff0c;今天发布如下与甲骨文对Rimini Stre…

​支持AS2协议的开源的软件MTTK_AS2发布 [AS2] | [RFC4130] | [EDI] | [ANSI X12] | [EDIFACT]

​支持AS2协议的开源的软件MTTK_AS2发布 固执的可乐瓶 小型收发报文工具如何实现AS2协议&#xff1f;MTTK_AS2开源产品推荐 许多中小型企业 在与国外的系统进行数据传输时&#xff0c;通常会被要求使用AS2协议进行报文的传输&#xff0c;而国内对于AS2协议支持的开源软件少之…

ITS4130Q-EP-D是一款130mΩ四通道智能高压侧电源开关——科时进商城

​ 四个通道的电流均大于500 mA&#xff0c;Tj125C时的典型RDS&#xff08;ON&#xff09;值非常低&#xff0c;为205mΩ&#xff0c;以及小型PG-TSDSO-14外露焊盘封装&#xff0c;将高灵活性与最低空间要求结合在一起。热增强PG-TSDSO-14封装的外露焊盘允许通过热通孔从器件到…

百炼 4130: Saving Tang Monk

同一个S可能需要多次经过&#xff0c;只需杀一次。 #define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<algorithm> #include<queue> using namespace std;const int N 100 5;char s[N][N]; int si, sj, n, m, ei, ej, p[N][N];struct Node {int…