Умножение точек эллиптической кривой
Скалярное умножение эллиптической кривой — это операция последовательного многократного добавления точки вдоль эллиптической кривой сама к себе. Он используется в криптографии на основе эллиптических кривых (ECC). В литературе эта операция представлена как скалярное умножение , записанное в гессенской форме эллиптической кривой . Широко распространенное название этой операции — также умножение точек эллиптической кривой , но это может создать неправильное впечатление, что это умножение между двумя точками.
Основы [ править ]
Учитывая кривую E , определенную некоторым уравнением в конечном поле (например, E : y 2 = х 3 + ax + b ), умножение точек определяется как повторное добавление точки вдоль этой кривой. Обозначим как nP = P + P + P + … + P для некоторого скалярного (целого) n и точки P = ( x , y ), на кривой E. лежащей Этот тип кривой известен как кривая Вейерштрасса.
Безопасность современного ECC зависит от сложности определения n из Q = nP при известных значениях Q и P , если n велико (известная как проблема дискретного логарифмирования эллиптической кривой по аналогии с другими криптографическими системами ). Это связано с тем, что добавление двух точек на эллиптической кривой (или добавление одной точки к самой себе) дает третью точку на эллиптической кривой, местоположение которой не имеет очевидной связи с местоположениями первых двух, и это повторяется много раз. over дает точку nP , которая может находиться практически где угодно. Интуитивно это похоже на тот факт, что если бы у вас была точка P на окружности, добавление 42,57 градуса к ее углу все равно может быть точкой «не слишком далеко» от P , но добавление 1000 или 1001 раза по 42,57 градуса даст точка, которая требует немного более сложных вычислений, чтобы найти исходный угол. Обратить этот процесс, т. е. при условии Q=nP и P , и определить n , можно только перепробовав все возможные n — усилие, которое вычислительно невыполнимо, если n велико.
Точечные операции [ править ]
Для точек эллиптической кривой обычно используются три операции: сложение, удвоение и отрицание.
Точка в бесконечности [ править ]
Точка в бесконечности — единичный элемент арифметики эллиптических кривых. Добавление его к любой точке приводит к созданию этой другой точки, включая добавление точки, находящейся на бесконечности, к самой себе. То есть:
Точка на бесконечности также записывается как 0 .
Отрицание точки [ править ]
Отрицание точки - это поиск такой точки, прибавление которой к самой себе приведет к точке, находящейся в бесконечности ( ).
Для эллиптических кривых вида E : y 2 = х 3 + ax + b , отрицание — это точка с той же координатой x, но с отрицательной координатой y :
Добавление очков [ править ]
При наличии двух различных точек P и Q полученной в результате пересечения кривой E и прямой линии, определяемой точками P и Q , дающей точку R. сложение определяется как отрицание точки , [1]
Предполагая, что эллиптическая кривая E задается выражением y 2 = х 3 + ax + b это можно рассчитать как:
Эти уравнения верны, если ни одна из точек не является точкой, находящейся на бесконечности, , и если точки имеют разные координаты x (они не являются взаимно инверсными). Это важно для алгоритма проверки ECDSA , где значение хеш-функции может быть нулевым.
Удвоение очков [ править ]
Если точки P и Q совпадают (в одних и тех же координатах), сложение аналогично, за исключением того, что нет четко определенной прямой линии, проходящей через P , поэтому операция завершается с использованием предельного случая, касательной к кривой E , у П.
Это рассчитывается, как указано выше, с использованием производных (dE/dx)/(dE/dy): [2]
где a взято из определяющего уравнения кривой E , приведенного выше.
Умножение точек [ править ]
Самый простой способ вычисления умножения точек — многократное сложение. Однако существуют более эффективные подходы к вычислению умножения.
Двойное сложение [ править ]
Самый простой метод — метод двойного сложения. [3] аналогично квадрату и умножению в модульном возведении в степень. Алгоритм работает следующим образом:
Чтобы вычислить sP , начните с двоичного представления s : , где .
- Итерационный алгоритм, увеличение индекса:
let bits = bit_representation(s) # the vector of bits (from LSB to MSB) representing s
let res = # point at infinity
let temp = P # track doubled P val
for bit in bits:
if bit == 1:
res = res + temp # point add
temp = temp + temp # double
return res
- Итерационный алгоритм, уменьшение индекса:
let bits = bit_representation(s) # the vector of bits (from LSB to MSB) representing s let i = length(bits) - 2 let res = P while (i >= 0): # traversing from second MSB to LSB res = res + res # double if bits[i] == 1: res = res + P # add i = i - 1 return res
Обратите внимание, что оба описанных выше итерационных метода уязвимы для временного анализа. Альтернативный подход см. ниже в «Лестнице Монтгомери».
- Рекурсивный алгоритм:
f(P, d) is if d = 0 then return 0 # computation complete else if d = 1 then return P else if d mod 2 = 1 then return point_add(P, f(P, d - 1)) # addition when d is odd else return f(point_double(P), d / 2) # doubling when d is even
где f — функция умножения, P — координата умножения, d — количество раз, которое нужно прибавить координату к самой себе. Пример: 100P можно записать как 2(2[P + 2(2[2(P + 2P)])]) и, таким образом, требует шести операций удвоения точек и двух операций сложения точек. 100P будет равно f(P, 100) .
Этот алгоритм требует log 2 ( d ) итераций удвоения и сложения точек для вычисления полного умножения точек. Существует множество вариантов этого алгоритма, например использование окна, скользящего окна, NAF, NAF-w, векторных цепочек и лестницы Монтгомери.
Оконный метод [ править ]
В оконной версии этого алгоритма [3] выбирают размер окна w и вычисляют все значения для . Алгоритм теперь использует представление и становится
Q ← 0 for i from m to 0 do Q ← point_double_repeat(Q, w) if di > 0 then Q ← point_add(Q, diP) # using pre-computed value of diP return Q
Этот алгоритм имеет ту же сложность, что и подход «двойное сложение», но с преимуществом использования меньшего количества добавлений точек (которые на практике медленнее, чем удвоение). Обычно значение w выбирается достаточно небольшим, что делает этап предварительных вычислений тривиальным компонентом алгоритма. Для кривых, рекомендованных NIST, обычно это лучший выбор. Полная сложность для n -битного числа измеряется как очко удваивается и точечные дополнения.
Метод скользящего окна [ править ]
В версии со скользящим окном мы стремимся заменить добавление очков удвоением очков. Мы вычисляем ту же таблицу, что и в оконной версии, за исключением того, что мы вычисляем только точки для . По сути, мы вычисляем только те значения, для которых установлен старший бит окна. Затем алгоритм использует исходное представление двойного сложения .
Q ← 0 for i from m downto 0 do if di = 0 then Q ← point_double(Q) else t ← extract j (up to w − 1) additional bits from d (including di) i ← i − j if j < w then Perform double-and-add using t return Q else Q ← point_double_repeat(Q, w) Q ← point_add(Q, tP) return Q
Преимущество этого алгоритма состоит в том, что этап предварительного расчета примерно вполовину сложнее обычного оконного метода, а также позволяет заменить более медленное добавление очков удвоением очков. По сути, нет особых причин использовать оконный метод вместо этого подхода, за исключением того, что первый может быть реализован за постоянное время. Алгоритм требует очко удваивается и не более точечные дополнения.
w -арный несмежный метод формы ( w NAF) [ править ]
В несмежной форме мы стремимся использовать тот факт, что вычитание точек так же просто, как и добавление точек, чтобы выполнить меньше (и того, и другого) по сравнению с методом скользящего окна. NAF множимого необходимо сначала вычислить по следующему алгоритму
i ← 0 while (d > 0) do if (d mod 2) = 1 then di ← d mods 2w d ← d − di else di = 0 d ← d/2 i ← i + 1 return (di−1, di-2, …, d0)
Где подписанные функции по модулю mods определяются как
if (d mod 2w) >= 2w−1 return (d mod 2w) − 2w else return d mod 2w
Это создает NAF, необходимый для выполнения умножения. Этот алгоритм требует предварительного расчета точек и их негативы, где это точка, которую нужно умножить. На типичных кривых Вейерштрасса, если затем . Так что, по сути, вычислить негативы несложно. Далее следующий алгоритм вычисляет умножение :
Q ← 0 for j ← i − 1 downto 0 do Q ← point_double(Q) if (dj != 0) Q ← point_add(Q, djP) return Q
WNAF гарантирует, что в среднем будет плотность точечные дополнения (чуть лучше, чем неподписанное окно). Это требует удвоения на 1 очко и добавление точек для предварительного расчета. Тогда алгоритм требует удвоение очков и прибавление точек для оставшейся части умножения.
Одним из свойств NAF является то, что мы гарантируем, что каждый ненулевой элемент за которым следует как минимум дополнительные нули. Это связано с тем, что алгоритм очищает нижние кусочки с каждым вычитанием вывода функции mods . Это наблюдение можно использовать для нескольких целей. После каждого ненулевого элемента могут подразумеваться дополнительные нули, которые не нужно сохранять. Во-вторых, многократное серийное деление на 2 можно заменить делением на после каждого ненулевого элемент и делим на 2 после каждого нуля.
Было показано, что с помощью атаки по побочному каналу FLUSH+RELOAD на OpenSSL полный закрытый ключ может быть раскрыт после выполнения синхронизации кэша всего лишь с 200 выполненными подписями. [4]
Лестница Монтгомери [ править ]
Лестница Монтгомери [5] подход вычисляет умножение точек за фиксированное количество операций. , получает доступ к измерениям времени, энергопотребления или измерений ветвей Это может быть полезно, когда злоумышленник, выполняющий атаку по побочному каналу . Алгоритм использует то же представление, что и в методе «двойное сложение».
R0 ← 0 R1 ← P for i from m downto 0 do if di = 0 then R1 ← point_add(R0, R1) R0 ← point_double(R0) else R0 ← point_add(R0, R1) R1 ← point_double(R1) // invariant property to maintain correctness assert R1 == point_add(R0, P) return R0
Этот алгоритм по сути имеет ту же скорость, что и метод двойного сложения, за исключением того, что он вычисляет одинаковое количество сложений и удвоений точек независимо от значения множимого d . Это означает, что на этом уровне алгоритм не пропускает никакой информации через ветки или энергопотребление.
Однако было показано, что с помощью атаки по побочному каналу FLUSH+RELOAD на OpenSSL можно раскрыть полный закрытый ключ после выполнения синхронизации кэша только для одной подписи с очень низкими затратами. [6]
Код ржавчины для лестницы Монтгомери: [7]
/// Constant operation point multiplication.
/// NOTE: not memory safe.
/// * `s`: scalar value to multiply by
/// * multiplication is defined to be P₀ + P₁ + ... Pₛ
fn sec_mul(&mut self, s: big) -> E521{
let mut r0 = get_e521_id_point();
let mut r1 = self.clone();
for i in (0..=s.significant_bits()).rev() {
if s.get_bit(i) {
r0 = r0.add(&r1);
r1 = r1.add(&r1.clone());
} else {
r1 = r0.add(&r1);
r0 = r0.add(&r0.clone());
}
}
r0 // r0 = P * s
}
Лестница Монтгомери постоянным временем с
Безопасность криптографической реализации может столкнуться с угрозой так называемых тайминговых атак. который использует зависящие от данных временные характеристики реализации. Машины, работающие с криптографическими реализации потребляют переменное количество времени для обработки различных входных данных, поэтому время различаться в зависимости от ключа шифрования. Для решения этой проблемы реализованы криптографические алгоритмы. таким образом, чтобы исключить временную характеристику переменной, зависящей от данных, из реализации, ведущей к так называемым реализациям с постоянным временем. Реализации программного обеспечения считаются постоянными во времени. следующий смысл, как указано в: [8] « избегает всех ветвей, зависящих от ввода, всех индексов массива, зависящих от ввода, и других инструкций с таймингами, зависящими от ввода. Страница на GitHub [9] перечисляет правила кодирования для реализации криптографических операций и, в более общем плане, для операций, связанных с секретными или чувствительные ценности.
Лестница Монтгомери – это -алгоритм только координат для умножения точек эллиптической кривой и основан на правилах двойного и сложения для определенного набора кривых, известных как кривая Монтгомери . Алгоритм имеет условное ветвление так что условие зависит от секретного бита. Таким образом, простой реализации лестницы не будет. постоянное время и может привести к утечке секретного бита. Эта проблема нашла свое отражение в литературе. [10] [11] и известно несколько реализаций с постоянным временем. Ниже представлен лестничный алгоритм Монтгомери с постоянным временем, который использует две функции CSwap и Ladder-Step. В возвращаемом значении алгоритма Z 2 р-2 значение Z 2 -1 вычисляется с помощью малой теоремы Ферма .
Algorithm Montgomery-Ladder(xP,n) input: An -bit scalar and the -coordinate of a point . output: -coordinate of , the -times scalar multiple of .
X1 ← xP; X2 ← 1; Z2 ← 0; X3 ← xP; Z3 ← 1 prevbit ← 0 for from downto 0 do bit ← bit-value at index of b ← bit prevbit prevbit ← bit (X2,Z2,X3,Z3) ← CSwap(X2,Z2,X3,Z3,b) (X2,Z2,X3,Z3) ← Ladder-Step(X2,Z2,X3,Z3,X1)
return X2Z2p-2
Функция Ladder-Step (приведенная ниже), используемая в лестнице, является ядром алгоритма и представляет собой комбинированную форму дифференциальных операций сложения и удвоения. Поле константа a 24 определяется как a 24 = , где является параметром базовой кривой Монтгомери .
Function Ladder-Step(X2,Z2,X3,Z3,X1)
T1 ← X2 + Z2 T2 ← X2 - Z2 T3 ← X3 + Z3 T4 ← X3 - Z3 T5 ← T12 T6 ← T22 T2 ← T2 · T3 T1 ← T1 · T4 T1 ← T1 + T2 T2 ← T1 - T2 X3 ← T12 T2 ← T22 Z3 ← T2 · X1 X2 ← T5 · T6 T5 ← T5 - T6 T1 ← a24 · T5 T6 ← T6 + T1 Z2 ← T5 · T6
return (X2,Z2,X3,Z3)
Функция CSwap управляет условным ветвлением и помогает релейной схеме работать в соответствии с требованиями реализации с постоянным временем. Функция меняет местами пару элементов поля Х 2 ,З 2 и Х 3 , Я 3 только если = 1 и это делается без утечки какой-либо информации о секретном бите. В литературе предложены различные методы реализации CSwap. [10] [11] Менее затратным вариантом управления требованием постоянного времени лестницы Монтгомери является условный выбор, который формализуется с помощью функции CSelect. Эта функция использовалась в различных оптимизациях и формально обсуждалась в [12]
С момента появления стандартной кривой Монтгомери Curve25519 на 128-битном уровне безопасности существовало множество программных реализаций для вычисления ECDH на различных архитектурах и для достижения максимально возможной производительности разработчики криптографических систем прибегали к написанию реализаций с использованием языка ассемблера базовой архитектуры. . Работа [13] предоставил пару реализаций 64-битной сборки, ориентированных на архитектуру AMD64. Реализации были разработаны с использованием инструмента, известного как qhasm. [14] который может генерировать высокоскоростные криптографические программы на языке ассемблера. Следует отметить, что в реализации этих цепочек использовалась функция CSwap. После этого было предпринято несколько попыток оптимизировать реализацию релейной логики с помощью написанных вручную программ на ассемблере, в которых впервые было использовано понятие CSelect. [15] а потом в. [16] Помимо использования последовательных инструкций, векторные инструкции также использовались для оптимизации вычислений лестницы посредством различных работ. [17] [18] [19] [20] Наряду с AMD64 также были предприняты попытки добиться эффективной реализации на других архитектурах, таких как ARM. Работы [21] и [22] обеспечивает эффективные реализации, ориентированные на архитектуру ARM. Библиотеки lib25519 [23] и [24] — это две современные библиотеки, содержащие эффективные реализации лестницы Монтгомери для Curve25519 . Тем не менее, в библиотеках есть реализации и других криптографических примитивов.
Помимо Curve25519 , было несколько попыток вычислить лестницу по другим кривым на различных уровнях безопасности. эффективные реализации лестницы по стандартной кривой Curve448 на 224-битном уровне безопасности. В литературе также изучались [15] [18] [20] Была предложена кривая под названием Curve41417, обеспечивающая безопасность чуть более 200 бит. [25] в котором вариант стратегии Карацубы использовался для реализации умножения полей, необходимого для соответствующего программного обеспечения ECC. В поисках кривых Монтгомери, которые могли бы конкурировать с Curve25519 и Curve448, было проведено исследование и предложено несколько кривых наряду с эффективными последовательными [16] и векторизованные реализации [20] соответствующих лестниц. На 256-битном уровне безопасности эффективные реализации лестницы также рассматривались с помощью трех различных кривых Монтгомери. [26]
Ссылки [ править ]
- ^ «Эллиптические кривые — формулы явного сложения» .
- ^ «Эллиптические кривые — формулы явного сложения» .
- ↑ Перейти обратно: Перейти обратно: а б Хэнкерсон, Даррел; Ванстон, Скотт; Менезес, Альфред (2004). Руководство по криптографии на основе эллиптических кривых . Springer Профессиональные вычисления. Нью-Йорк: Springer-Verlag. дои : 10.1007/b97644 . ISBN 0-387-95273-Х . S2CID 720546 .
- ^ Бенгер, Наоми; ван де Поль, Йооп; Смарт, Найджел П.; Яром, Юваль (2014). Батина, Лейла; Робшоу, Мэтью (ред.). «Ох-а-а… совсем немного»: небольшое количество побочного канала может иметь большое значение (PDF) . Криптографическое оборудование и встроенные системы – CHES 2014. Конспекты лекций по информатике. Том. 8731. Спрингер. стр. 72–95. дои : 10.1007/978-3-662-44709-3_5 . ISBN 978-3-662-44708-6 .
- ^ Монтгомери, Питер Л. (1987). «Ускорение методов факторизации Полларда и эллиптических кривых» . Математика. Комп. 48 (177): 243–264. дои : 10.2307/2007888 . JSTOR 2007888 . МР 0866113 .
- ^ Яром, Юваль; Бенгер, Наоми (2014). «Восстановление одноразовых номеров OpenSSL ECDSA с использованием атаки по побочному каналу кэша FLUSH+RELOAD» . Архив электронной печати криптологии IACR .
- ^ Рэй, Дастин. «Е521» . Проверено 25 февраля 2023 г.
- ^ Бернштейн, Дэниел Дж. «Curve25519: Новые рекорды скорости Диффи-Хеллмана» . В: Юнг М., Додис Ю., Киайас А., Малкин Т. (ред.) Криптография с открытым ключом - PKC 2006. Конспект лекций по информатике, том 3958. Springer, Берлин, Гейдельберг.
- ^ Омассон, Жан-Филипп. «Руководство по программному обеспечению низкоуровневой криптографии» . Гитхаб . Проверено 26 марта 2024 г.
- ↑ Перейти обратно: Перейти обратно: а б Бернштейн, Дэниел Дж.; Ланге, Таня. «Кривые Монтгомери и лестница Монтгомери» . В книге Джоппе В. Боса и Арьена К. Ленстры, редакторов, «Темы вычислительной теории чисел», вдохновленные Питером Л. Монтгомери, страницы 82–115. Издательство Кембриджского университета, 2017.
- ↑ Перейти обратно: Перейти обратно: а б Костелло, Крейг; Смит, Бенджамин. «Кривые Монтгомери и их арифметика — случай больших характеристических полей» . Дж. Криптографическая инженерия, 8 (3): 227–240, 2018.
- ^ Нат, Кошик; Саркар, Палаш. «Лестница Монтгомери в постоянное время» . Архив криптологии ePrint, статья 2020/956.
- ^ Бернштейн, Дэниел Дж.; Дуиф, Нильс; Ланге, Таня; Швабе, Питер; Ян, Бо Инь. «Высокоскоростные подписи с высокой степенью защиты» . Журнал «Криптографическая инженерия», 2(2):77–89, 2012.
- ^ Бернштейн, Дэниел Дж. «qhasm: инструменты, помогающие писать высокоскоростное программное обеспечение» .
- ↑ Перейти обратно: Перейти обратно: а б Оливейра, Томаз; Лопес, Хулио; Хисил, Хусейн; Фас-Эрнандес, Армандо; Родригес-Энрикес, Франциско. «Как (предварительно) вычислить лестницу: улучшение производительности X25519 и X448» . Карлайл Адамс и Ян Камениш, редакторы, «Выбранные области криптографии - SAC 2017 - 24-я международная конференция», Оттава, Онтарио, Канада, 16–18 августа 2017 г., Пересмотренные избранные статьи, том 10719 конспектов лекций по информатике, страницы 172– 191. Springer, 2017. Код доступен по адресу https://github.com/armfazh/rfc7748_precomputed .
- ↑ Перейти обратно: Перейти обратно: а б Нат, Кошик; Саркар, Палаш. «Компромисс безопасности и эффективности для эллиптической кривой Диффи-Хеллмана на 128- и 224-битных уровнях безопасности» . J Cryptogr Eng 12, 107–121 (2022). , Код доступен по адресу https://github.com/kn-cs/x25519.
- ^ Чжоу, Тунг. «Sandy2x: Новые рекорды скорости Curve25519» . Орр Данкельман и Лиам Келихер, редакторы, «Выбранные области криптографии – SAC 2015 – 22-я Международная конференция», Саквилл, Северная Каролина, Канада, 12–14 августа 2015 г., Пересмотренные избранные статьи, том 9566 конспектов лекций по информатике, страницы 145–160. Springer, 2015. Код доступен по адресу https://tungchou.github.io/sandy2x/.
- ↑ Перейти обратно: Перейти обратно: а б Фас-Эрнандес, Армандо; Лопес, Хулио; Дахаб, Рикардо. «Высокопроизводительная реализация криптографии на основе эллиптических кривых с использованием векторных инструкций» . АКМ Транс. Математика. Softw., 45(3):25:1–25:35, 2019. , Coce доступно по адресу https://github.com/armfazh/fld-ecc-vec.
- ^ Хисил, Хусейн; Эгриче, Беркан; Ясси, Мерт. «Быстрая четырехсторонняя векторизованная лестница для полного набора кривых Монтгомери» . Международный журнал науки информационной безопасности, Vol. 11, № 2, стр. 12-24. , Код доступен по адресу https://github.com/crypto-ninjaturtles/montgomery4x.
- ↑ Перейти обратно: Перейти обратно: а б с Нат, Кошик; Саркар, Палаш. «Эффективная четырехсторонняя векторизация лестницы Монтгомери» . Транзакции IEEE на компьютерах, том. 71, нет. 3, стр. 712–723, 1 марта 2022 г. , код доступен по адресу https://github.com/kn-cs/vec-ladder.
- ^ Бернштейн, Дэниел Дж.; Швабе, Питер. «НЕОН криптография» . Эммануэль Пруфф и Патрик Шаумон, редакторы, Криптографическое оборудование и встроенные системы - CHES 2012 - 14-й международный семинар, Левен, Бельгия, 9–12 сентября 2012 г. Материалы, том 7428 конспектов лекций по информатике, страницы 320–339. Спрингер, 2012.
- ^ Леннгрен, Эмиль. «Оптимизированная реализация AArch64 для X25519» (PDF) . Гитхаб.
- ^ Нат, Кошик; Бернштейн, Дэниел Дж . «lib25519» .
- ^ Харрисон, Джон Р. «s2n-bignum» .
- ^ Бернштейн, Дэниел Дж.; Чичанок, Чуэнсатиансуп; Таня, Ланге. «Curve41417: Возвращение к Карацубе» . В: Батина Л., Робшоу М. (ред.) Криптографическое оборудование и встроенные системы – CHES 2014. CHES 2014. Конспекты лекций по информатике, том 8731. Springer, Berlin, Heidelberg.
- ^ Нат, Кошик; Саркар, Палаш. «Эффективное вычисление Диффи-Хеллмана по эллиптической кривой на 256-битном уровне безопасности» . IET Information Security, 14(6):633640, 2020. Код доступен по адресу https://github.com/kn-cs/mont256-dh и https://github.com/kn-cs/mont256-vec.