点标量乘法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。