传统的加密通信需要通信双方共享一个密钥,即用于加密和解密的密钥,此种方法的一个问题就是双方必须就共享密钥达成一致,但是共享密钥的传输又需要通信,从而该密钥有着被攻击者窃取的风险。在互联网普及的今天,在网络世界中通信各方之间可能从来没有接触过,即需要一种在没有预先共享密钥的情况下能进行安全通信的方法,即所谓的非对称加密算法。
假设A要和B之间需要通信,但是A与B并未共享一个密钥,在此情况下他们之间如何进行安全通信呢?
为了方便阐述非对称加密的概念,假定通信者A与B共享一个公钥,这个公钥是公开的,任何人都可以获得(对于攻击者来说也是如此),该公钥用Kpublic表示。
A可以持有一个私钥KprivateA,A基于这个私钥KprivateA进行某种运算f,即f(KprivateA,Kpublic)。B也随机生成私钥KprivateB进行运算f即f(KprivateB,Kpublic),紧接着A,B以明文方式交换他们的运算结果(入侵者可以截取到该信息),即此时A获得了f(KprivateB,Kpublic)记为fB,B获得了f(KprivateA,Kpublic) 记为fA。
然后A与B进行运算g,即A运算得到g(fB,KprivateA,Kpublic),B运算得到g(fA,KprivateB,Kpublic),分别记做gA和gB,并且存在着这样的运算使得gA=gB,此时gA和gB分别是A与B的新的私钥,即通信中加密/解密的私钥。
从上面的过程来看A,B之间任何一方都无须分发任何敏感的私钥(初始的私钥是各自持有的,无须在信道上传输)。假定在A,B通信的过程中有一个攻击者C截获了他们之间的报文,显然入侵者只能获取Kpublic,f(KprivateB,Kpublic)与f(KprivateA,Kpublic),而无法获得真正的私钥gA和gB,因此无法解密报文,保证了通信的安全性。下面我们将介绍应用这一过程的算法-Diffie-Hellman密钥交换算法。
为了方便叙述,假设A和B需要进行安全通信,需要安全地生成一个密钥,而中间有一个攻击者C在窃听,其基本步骤如下:
-
A和B公开化达成共识,选择
数a
和
素数p
(质数,只能被1和自己整除的数),假设分别为
a=5
和
p=23
,可以当成是公钥,这个信息是A,B和攻击者C都掌握的。
-
A随机选择一个数,记为
s1=29
,即A的私钥,计算单向函数
f(s1) = a**s1 mod p
的值(**表示乘方),记为f1(此处计算得17),
f1=5**29 mod 23=17
,然后将计算得到的值发送给B。在这个过程中, B得到单项函数的值17,攻击者C也能截获。
-
B也选择一个数,记为
s2=33
,即B的私钥, 计算单向函数
f(s2) = a**s2 mod p
的值,记为f2(此处计算得22),
f2=5**33 mod 23=22
,然后将计算得到的值发送给A。在这个过程中,A得到单向函数的值22,窃听者C也能截获。
-
定义函数
g1(x)=f2**x mod p
,A计算g1(s1)的值作为密钥,此例中为
g1(29) = 22**29 mod 23=22。
-
定义函数
g2(x)=f1**x mod p
,B计算g2(s2)的值作为密钥,此例中为
g2(33) = 17**33 mod 23=22
。
上述整个过程如下图1所示:
图1 A,B通信过程
可以发现
g1(x)= g2(x)
,即
(a**s2 mod p)**s1 mod p= (a**s1 mod p)**s2 mod p
。事实上根据数论理论可以证明对任意整数,有上式成立。通信双方只需知道公钥a,p以及交换非敏感信息f1,f2就可以完成密钥交换这一工作,从而在后续的通信中使用生成的密钥来加密/解密信息。
使用python进行简单的编程验证,代码如下图2:(运行1000次输出结果为Success)
图2 python验证代码
输出结果如下图3:
图3 代码输出结果
Diffie-Hellman算法的有效性依赖于计算离散对数的难度 ,即此时窃听者尽管能截获f1,f2以及获知所用的公钥,但是想从f1、f2、a与p计算出指数s1,s2是十分困难的,进而也就无法计算出私钥g1,g2。
Diffie-Hellman算法让通信双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥,这个密钥一般作为对称加密的密钥而被双方在后续数据传输中使用。
Diffie-Hellman算法仅当需要时才生成密钥,减小了将密钥存储很长一段时间而致使遭受攻击的机会,除对全局参数即公钥的约定外,密钥交换不需要事先约定其它参数,这也是非对称加密的优势所在。
然而Diffie-Hellman算法也有着以下一些缺点:
-
通信时没有提供双方身份的任何信息;
-
该算法是计算密集性的,因此容易遭受阻塞性攻击,即对手请求大量的密钥时本机会花费了相对多的计算资源来求解参数而不是在做真正的工作;
-
没办法防止重演攻击,即攻击者截获了先前的整个过程的通信报文,然后来重演这一过程,向本机重发一模一样的报文;
-
容易遭受中间人的攻击,即攻击者C在和A通信时扮演B,在和B通信时扮演A。A和B都与C协商了一个密钥,然后C就可以监听A,B的通信过程;
以上的一些缺点并没有阻止Diffie-Hellman算法在实际工程中的广泛应用,通常可以采用一些辅助技术来弥补上述缺点,如数字签名技术、鉴别协议与MAC(Message Authentication Code)技术等。
目录0. 摘要1. 概述2. Diffie-Hellman算法原理2.1 Diffie-Hellman算法原理2.2 Diffie-Hellman算法的优缺点转载自原文在原文基础上优化了一下,加上注释,更好读懂0. 摘要非对称加密算法又称公开密钥加密算法,非对称加密是相对于对称加密而言的,对称加密指的是通信双方使用的密钥是一致的,而非对称加密就是算法使用的密钥不一致。非对称加密的好处是当通信双方没有事先协商密钥的情况下也能进行安全通信,而在互联网普及的今天,很多通信双方往往在事先是无法协商好密钥的
理解
Diff
ie-
Hellman
算法
的实现原理,编程实现
Diff
ie-
Hellman
算法
的程序,能够实现密钥协商的目的
二、实验原理
w.
Diff
ie与M.
Hellman
在1976年提出一个称为
Diff
ie——
Hellman
密钥交换的公钥密码
算法
。该
算法
能用来在两个用户之间安全地交换密钥材料,从而使双方
得到
一个共享的会话密钥,但该
算法
只能用于交换密钥,不能用于加/解密。
Diff
ie...
Diff
ie-
Hellman
密钥交换技术
文章目录
Diff
ie-
Hellman
密钥交换技术描述大体介绍加解密解释
英文名
Diff
ie-
Hellman
key exchange(简称DH)。
Diff
ie-
Hellman
密钥交换是一个在公共渠道安全交换加解密密钥的方法。DH是加解密领域最早的公钥交换实际
应用
的例子之一。
传统上,双方之间的安全加密通信要求他们首先通过一些安全的物理渠道来交换密钥。...
1、
Diff
ie-
Hellman
算法
简介
Diff
ie-
Hellman
算法
(以下简称为:DH
算法
),是最早的密钥交换
算法
之一,它使得通信的双方能在非安全的信道中安全的交换密钥,用于加密后续的通信消息。
起基本流程原理如下:
假定小明和小红期望在一个不安全的网络中协商一个共同的密钥,那么进行如下步骤:
两人先说好大素数(质数)p和它的原始根g。
小明随机产生一个数a,并计算A = p^a mod g, 发送给小红。
小红随机产生一个数b,并计算......
Alice和Bob想要协商出一个只有它们两人知道的颜色,不能让第三方知道,怎么办呢?解决办法如下:
先从它们共同拥有的颜色(图中为黄色)开始,这个黄色是大家都知道的,第三方知道也没有关系。
Alice选了一个只有自己知道的颜色(图中为红色),并将之混入大家知道的黄色中,形成新的颜色(图中为棕色)。
Bob也选了一个只有自己知道的
diff
ie-
Hellman
(DH)
算法
原理
Diff
ie-
Hellman
算法
是Whitefield
Diff
ie和Martin
Hellman
在1976年公布的一种
秘钥
交换
算法
,它是一种建立
秘钥
的方法,而不是加密方法,所以
秘钥
必须和其他一种加密
算法
结合
使用
。这种
秘钥
交换技术的目的在于使两个用户安全的交换一个
秘钥
一遍后面的报文加密。
Diff
ie-
Hellman
密钥交换
算法
的有效性依赖于计算离散对数的难度。
模型
分析
1)由消息发送的一方构建密钥,这里由甲方构建密钥。
2)由构建密钥的一方向对方公布其公钥
Bob利用对称
秘钥
K对信息进行加密并将加密结果发送给Alice,Alice收到信息之后,用同样的
秘钥
进行解密。
问题1:Alice是如何知道对称
秘钥
K的?------即,Bob首先
需要
将对称
秘钥
K发送给Alice,Alice才能对信息进行解密。即:通信双方
需要
达成共识,也就是用什么样的
秘钥
进行加密。
由此推出:传递信息的前提是
需要
关于
秘钥
达成共识,也就是传递
秘钥
。
问题2:...