Код: Выделить всё
def square_and_multiply(base, exponent, modulus):
result = 1
base = base % modulus
exponent_bits = bin(exponent)[2:]
for i in range(len(exponent_bits) - 1, -1, -1):
result = (result * result) % modulus
if exponent_bits[i] == '1':
result = (result * base) % modulus
return result
Чтобы решить эту проблему, мой профессор предложил изменить алгоритм, включив в него фиктивное умножение, обеспечивая постоянство времени независимо от значения бита. Обновленный код выглядит следующим образом:
Код: Выделить всё
def square_and_multiply_dummy(base, exponent, modulus):
result = [1, 1]
base = base % modulus
exponent_bits = bin(exponent)[2:]
for i in range(len(exponent_bits) - 1, -1, -1):
result[0] = (result[0] * result[0]) % modulus
result[1 - int(exponent_bits[i])] = (result[0] * base) % modulus
return result[0]
Почему?
Обратите внимание, что если я изменю эту строку:
Код: Выделить всё
result[1 - int(exponent_bits[i])] = (result[0] * base) % modulus
Подробнее здесь: https://stackoverflow.com/questions/792 ... nentiation