点标量乘法python 2.7信息泄漏
我正在尝试实现一个点标量双精度和加法乘法函数,它不会泄漏任何信息,任何信息都可能在恒定时间内执行。然而,最重要的是它不会泄露信息 我想请某人帮助我解决我们的问题,也许可以修复下面的代码,这样它就不会泄露信息。 我注意到,对于不同的标量大小,函数需要不同的时间来计算,这是不安全的 有什么帮助吗?请点标量乘法python 2.7信息泄漏,python,cryptography,multiplication,ellipse,scalar,Python,Cryptography,Multiplication,Ellipse,Scalar,我正在尝试实现一个点标量双精度和加法乘法函数,它不会泄漏任何信息,任何信息都可能在恒定时间内执行。然而,最重要的是它不会泄露信息 我想请某人帮助我解决我们的问题,也许可以修复下面的代码,这样它就不会泄露信息。 我注意到,对于不同的标量大小,函数需要不同的时间来计算,这是不安全的 有什么帮助吗?请 def point_scalar_multiplication_double_and_add(a, b, p, x, y, scalar): """ Implement Point multiplica
def point_scalar_multiplication_double_and_add(a, b, p, x, y, scalar):
"""
Implement Point multiplication with a scalar:
r * (x, y) = (x, y) + ... + (x, y) (r times)
Reminder of Double and Multiply algorithm: r * P
Q = Inf
for i = 0 to num_bits(P)-1
if bit i of P == 1 then
Q = Q + P
P = 2 * P
return Q
"""
Q = (None, None)
P = (x, y)
binary = bin(scalar)
for i in range(scalar.num_bits()):
if binary[scalar.num_bits()-i+1] == '1':
Q = point_add(a, b, p, Q[0], Q[1], P[0], P[1])
#print Q
pass
P = point_double(a, b, p, P[0],P[1])
pass
return Q
试试这个。我根据标量的值对位计数进行硬编码以避免泄漏,并尝试平衡指令,而不管是否执行操作 我找不到“num_bits”文档,所以我假设您的标量是某种对象。请将NUM_BITS常量调整为标量值的最大大小(至少是您打算使用的最大值) 在一些地方,我确实在网上发现了提及numbits的地方,它指的是活动位的数量,如果使用它,可能会泄漏数据(例如标量(1).num_bits()!=标量(1000).num_bits() 编辑:
def point_scalar_multiplication_double_and_add(a, b, p, x, y, scalar):
"""
Implement Point multiplication with a scalar:
r * (x, y) = (x, y) + ... + (x, y) (r times)
Reminder of Double and Multiply algorithm: r * P
Q = Inf
for i = 0 to num_bits(P)-1
if bit i of P == 1 then
Q = Q + P
P = 2 * P
return Q
"""
Q = (None, None)
Q2 = Q
P = (x, y)
binary = bin(scalar)
binary = binary[2:] # get rid of 0b
NUM_BITS = 64
# pre-pad binary with 0s - 1010 becomes 0000000...00001010
binary = '0' * (NUM_BITS - len(binary)) + binary
# reverse binary and iterate over bits
for b in binary[::-1]:
Q2 = point_add(a, b, p, Q[0], Q[1], P[0], P[1])
if b == '1':
Q = Q2
else:
Q2 = Q # Useless, but balances instruction count
P = point_double(a, b, p, P[0],P[1])
return Q
您的问题很尴尬,因为不清楚您工作的“约束”是什么,以及代码的可能优化是什么。例如,您将乘法实现为“double and add”,但大多数python代码只会将点的元素相乘。这是一种约束,还是你不知道怎么做?我不知道。我只需要修正函数,使其在恒定时间内工作。我知道我们可以用time.clock()来测量执行不同标量所需的时间,它表明数据泄露了。a、b和p是什么?a、b是曲线的参数,p是模p。