我的任务是重现下面的情节:
它来自this journal(第137-145页)
在this article中,作者描述了一种称为针对Diffie-Hellman密钥交换的窃贼攻击。特别是,他们编写了以下算法:
现在,在2中,作者认为“也许我们可以实现诚实的DHKE和恶意的DHKE,然后我们比较这两种算法的运行时间”。然后,创建了上面的绘图。为此,他们说
"We have implemented contaminated and uncontaminated versions of Diffie-Hellman protocols in ANSI C and linked with RSAREF 2.0 library using GNU C v 2.7 compiler. All tests were run on Linux system using a computer with a Pentium II processor (350 MHz) and 64 Mb memory. Computation time for a single protocol was measured in 10- 2s."
我想做同样的事情,即实施善恶DH并比较运行时间。这是我产生的代码:
import timeit #used to measure the running time of functions
import matplotlib.pyplot as plt #plot the results
import random
import numpy as np
import pyDH #library for Diffie-Hellman key exchange
X= pyDH.DiffieHellman() #Eve's private key
Y= X.gen_public_key() #Eve's public key
#The three integers a,b,W embedded by Eve
W=3
a=2
b=2
#Honest DH
def public_key():
d1 = pyDH.DiffieHellman()
return d1.gen_public_key()
#Malicoius Diffie_Hellman (SETUP) #line 1-7 in the algorithm
def mal_public_key():
d1 = pyDH.DiffieHellman().get_private_key()
t=random.choice([0,1])
z1=pow(pyDH.DiffieHellman().g,d1-W*t,pyDH.DiffieHellman().p)
z2=pow(Y,-a*d1-b,pyDH.DiffieHellman().p)
z= z1*z2 % pyDH.DiffieHellman().p
d2=hash(z)
return pow(pyDH.DiffieHellman().g,d2,pyDH.DiffieHellman().p)
#function that plot the results
def plot(ntest=100000):
times = []
times2=[]
for i in range(ntest):
#Running time HONEST Diffie-Hellman (worked two times = two key generations)
elapse_time = timeit.timeit(public_key, number=2)
#here I collect the times
times += [int(round(elapse_time* pow(10, 2) ) )]
# Running time MALICOIUS Diffie-Hellman
elapse_time2 = timeit.timeit(mal_public_key, number= 1)
times2 += [int(round(elapse_time2* pow(10, 2)) )]
x_axis=[i for i in range(0,20)]
#collect how many tests last i seconds
y_axis = [times.count(i) for i in x_axis]
y_axis2 = [times2.count(i) for i in x_axis]
plt.plot(x_axis, y_axis, x_axis, y_axis2)
plt.show()
plot()
我用pyDH表示诚实的Diffie Hellman。这个代码给了我这个数字:
我认为蓝线(诚实DH)是可以的,但我对橙色线(设置DH)有点怀疑,橙色线与此功能相关:
def mal_public_key(): #line 1-7 in the algorithm
d1 = pyDH.DiffieHellman().get_private_key()
t=random.choice([0,1])
z1=pow(pyDH.DiffieHellman().g,d1-W*t,pyDH.DiffieHellman().p)
z2=pow(Y,-a*d1-b,pyDH.DiffieHellman().p)
z= z1*z2 % pyDH.DiffieHellman().p
d2 = hash(z)
return pow(pyDH.DiffieHellman().g,d2,pyDH.DiffieHellman().p)
"It is interesting that the curve representing the contaminated implementation has a small peak at the same value of computation time where the correct implementation has its only peak. [...] There are two different parts which occur every second call to device. The first one is identical to original [...] protocol and exactly this part is presented on the small peak. The disproportion between two peaks of curve representing contaminated implementation is clearly visible. The reason is that for practical usage after the first part of the protocol, (i.e. lines 1-3) device repeats the second part (i.e. lines 4-7) not once but many times."
你能给我解释一下这句话吗?特别是,为什么在我的情节中没有小橘子峰?可能mal_public_key()
函数不好
我正在使用Windows10 64位、8Gb内存、AMD A10-8700P radeon R6、10个计算核心4C+6G 1.80GHz,其中我使用的是Python 3.8。我知道我的电脑应该比作者的好(我想)。也许这会影响结果。然而,在椭圆曲线上显示了一个类似的实验,其曲线图与原始曲线图接近(但它是一条椭圆曲线)
(p.S.我假设a=b=2
和W=3
,因为Young和Young没有说明这些整数应该是什么)
用一个具体的例子最容易理解这个问题:Alice有一个为她生成Diffie-Hellman密钥的设备。在该设备上实现了恶意Diffie-Hellman变体
恶意DH变体/设置的实现
恶意DH变体定义如下,shere,第二节。3.1:
MDH1:对于第一个生成的密钥对,以下内容适用:
MDH2:对于第二个生成的密钥对,以下内容适用:
MDHi:第三个和后续的密钥对会发生什么情况?对于第二个生成的密钥对使用相同的算法,例如,对于第三个密钥交换,现在使用c2代替c1,并且现在使用m2代替m1,或者通常,如果生成第i个密钥对ci,则生成mi:
请注意,有两类密钥交换进程,MDH1和MDHi,它们将在稍后讨论定时行为时发挥重要作用
对发布的恶意DH变体实施的评估:
设置(具有通用保护的秘密嵌入式活板门)不是通过问题中发布的恶意DH变体实施的。
安装程序在两个连续生成的密钥对之间建立关系。这使得可以从两个这样的相关公钥导出上一代密钥的私钥,这两个公钥可以在密钥交换过程中被截获。
但为此,必须在连续的密钥生成之间传递私钥,以便在最后一代密钥中使用它来建立这种关系。这不会发生在实现中,因此无法实现所需的关系。
从更技术的角度来看,实现失败的主要原因是MDH1和MDHi案例不是单独实现的,而是作为一个关闭的过程一起实现的。关闭,即在连续调用之间不存储私钥,因此无法传递。因此,实现的后续调用将生成相互之间不具有所需关系的随机密钥对。
还请注意,从发布的实现和论文中使用的实现的相似时间行为(仅相似,因为缺少次峰值,将在下文中讨论),当然不能得出任何工作实现的结论
安装程序的Python实现或恶意Diffie-Hellman变体可能如下所示:
请注意以下事项:
privateKey
中李>W
、a
、b
是攻击者已知的常量X
、Y
是攻击者的密钥对。只有作为私钥X
所有者的攻击者才能执行攻击W
、a
、b
是可自由选择的常数,这将引入随机性W
按定义是奇数李>Crypto.Random
,例如私钥)和哈希(SHA256摘要)李>下面的函数现在为Alice生成5个连续的密钥对:
输出如下所示:
核实
为了验证实现,执行了两个测试:
测试1:生成的密钥对与Hellman对不同吗?这可以通过比较生成的秘密进行验证,例如,如下所示(对于Alice,使用来自交换过程4的密钥对):
计算出的秘密是相同的:
测试2:攻击者能否确定Alice的私钥
导出密钥的算法是,shere,第二节。3.1:
除了攻击者都知道的常量
W
、a
、b
和私钥X
之外,只需要公钥mi和mi-1来确定私钥ci该算法的一种可能实现方式是:
为了验证,使用密钥交换过程3和4中的公钥:
结果是
从而对应于来自密钥交换4的私钥
时间行为分析
要比较恶意DH变体和标准DH变体的计时行为,需要实现标准DH变体:
SDHi:对于所有生成的密钥对,以下内容适用:
例如,通过以下实施:
恶意DH变体与标准DH变体之间的比较采用以下实现:
以下内容适用于此:
nTests
=执行1000次测试李>nKeyExPerTest
=10个密钥交换过程被执行privateKey
=-1确保每个测试都以MDH1重新开始李>以下两个图显示了密钥交换过程持续时间的频率分布:
左:x轴:x1000-1秒,右:x轴:x1000-1秒
这些数字在质量上与报纸上公布的数字相符:
恶意DH变体次峰值的解释:
最后,这里是一个link,是关于埃因霍温科技大学的一个有帮助的工作。p>在恶意DH变体的情况下,有两种不同的情况,MDH1和MDHi。MDH1实际上对应于标准DH变体SDHi的情况。这就是恶意数据的次峰值与标准DH变量的主峰重合的原因。
然而,MDH1和MDHi出现的频率不同。例如,对于这些测试,每个测试定义了10个密钥交换过程,即MDH1与MDHi交换的比率为1:9,这解释了相对于主峰,次峰明显更小的原因。
可以很容易地更改代码,以随机确定每个测试的密钥交换进程数,这将更现实。但是,对于固定数量的密钥交换过程,这种关系更容易说明。
为什么问题中发布的恶意DH变体的实现中没有出现次峰值?这是因为此实现将案例MDH1和MDHi组合在一起,并将它们作为一个案例实现,因此只测量一个值
相关问题 更多 >
编程相关推荐