Операции поддержки алгоритмов шифрования с открытым ключом и их реализация в микропроцессоре «Эльбрус» Выполнил: Скрябин Иван, 513 Научный руководитель: Сахин Ю.Х. Постановка задачи Развитие интернета и электронной коммерции вынуждает производителей микропроцессоров внедрять аппаратную поддержку алгоритмов шифрования: Intel (Westmere), AMD (Bulldozer) - AES VIA Padlock Security Engine - AES, SHA-1, SHA-256 - Умножение Монтгомери (поддержка шифров с открытым ключом) SPARC T3 (Криптографический ускоритель в каждом из 16 ядер) - DES, AES, Kasumi, MD5, SHA-1, SHA-256, SHA-512 - Modular Arithmetic Unit (поддержка шифров с открытым ключом) ЗАДАЧА: Предложить решение по аппаратной поддержке алгоритмов шифрования с открытым ключом в микропроцессорах «Эльбрус» Два типа алгоритмов шифрования Шифры с секретным ключом Encrypt Decrypt Bob Alice Многочисленное повторение одного и того же набора простых операций (раундов) над блоками данных 128 / 64 / 256 бит Большое разнообразие шифров – сложно выделить общие операции, эффективней реализовывать конкретные алгоритмы Шифры с открытым ключом Encrypt Decrypt Bob Alice Сложные операции (умножение по модулю) над очень большими числами (192 – 3072 бит) В основе – операции умножения и возведения в степень по модулю Операции в шифрах с открытым ключом RSA (1024 – 3072 бит) Генерация ключей: • Выбор простых p, q. φ = (p-1) * (q-1) • N = p * q (1024 – 3072 бита) • Выбор e, взаимно простого с φ • Вычисление d = e-1 mod φ (N, e) – открытый, (p, q, d) – секретный ключ Шифрование сообщения m (m < N) c = me mod N Расшифровка: m = cd mod N Основные операции (A, B, M: 1024 - 3072 бит) A*B mod M AB mod M ECDSA (192 – 512 бит) Операции над точками (x, y) эллипт. кривой y2 = x3 + a*x + b mod q Базовая точка P порядка n (n*P=0) Q=d*P : Q – открытый, d – секретный ключ Проверка подписи (r, s) сообщения m • Вычислить w = s-1 mod n • Вычислить u1 = m*w, u2 = r*w mod n • Вычислить X = u1*P + u2*Q = (x1, y1) • Сравнить x1 == r mod n Основные операции (числа: 192 – 512 бит) A*B mod M AB mod M P + Q (сложение точек элл. кривой) k*Q (умножение точки на скаляр) Арифметика в двоичном поле GF(2n) Стандарт DSS определяет так же операции в GF(2n), потому что они эффективно реализуются аппаратно. GF(2n) – конечное поле многочленов степени меньше n с коэффициентами 0 или 1 x6 + x4 + x2 + x + 1 → 01010111 (удобное представление в виде набора бит) Сложение и вычитание в GF(2n) 0101 0111 1000 0011 Сложение ↔ XOR 1101 0100 Вместо сложения и вычитания – операция XOR Умножение и деление в GF(2n) * 01010111 10000011 01010111 010101110 10101110000000 Умножение (сложение ↔ XOR) 10101101111001 10001101100000 100000011001 100011011000 11000001 Вычисление остатка по модулю (вычитание ↔ XOR) Операции в шифрах с открытым ключом ECDSA, ECDH, ГОСТ Р 31.10-2001 k*P P+Q AB mod M A * B mod M RSA, DSA, DH A-1 mod M в GF(P) и GF(2n) A, B, M, k - от 192 до 3072 бит - реализованные операции Умножение по модулю Требования к аппаратной реализации Масштабируемость (scalable) Возможность работы с числами «произвольного» размера – расчёт на будущее Работа в двух полях (dual-field) Поддержка операций в GF(p) и в GF(2n) в соответствии со стандартом США Высокая разрядность (high-radix) Разрядность функционального блока от 32 бит для повышения производительности Умножение по модулю Алгоритм Монтгомери Ключевая идея – заменить деление на M делением на 2n, которое легко выполняется аппаратно Mont(A, B) = A * B * 2-n mod M Алгоритм: A, B < M < 2n , M - нечётное M’ = -M-1 mod 2n // предвычисленная константа, зависит только от M P=A*B U = P * M’ mod 2n P = (P + U * M) >> n if P ≥ M then P=P–M end if // просто оставляем первые n бит // деление на 2n // результат в пределах 0 ≤ P < 2*M Умножение по модулю Алгоритм Монтгомери Использование умножения Монтгомери Mont(A, B) = A * B * 2-n mod M для вычисления A * B mod M 1. Переход к представлению Монтгомери: Ar = A * 2n mod M = Mont(A, 22n) Br = B * 2n mod M = Mont(B, 22n) 2. Вместо обычного умножения – умножение Монтгомери Pr = Mont(Ar, Br) = (A * 2n) * (B * 2n) * 2-n mod M = A * B * 2n mod M 3. Возврат к обычному представлению P = Mont(Pr, 1) = (A * B * 2n) * 1 * 2-n = A * B Эффективен только для выполнения множества операций подряд Умножение по модулю Аппаратная реализация алгоритма Монтгомери w бит – размер слова Умножение Монтгомери: Mont(A, B) = A * B * 2-n mod M * w – битный ALU A[i] B[j] P[i] M[i] P[i+j] A[3] A[2] A[1] A[0] B[3] B[2] B[1] B[0] A * B[0] M * U0 Uj w A * B[1] ALU M * U1 вычисляет в цикле A[i] * B[j] + P[i+j] P[i] + A * B[2] M[i] * Uj M * U2 A * B[3] M * U3 00 .. 0 00 .. 0 00 .. 0 00 .. 0 A * B * 2-n mod M A * B Умножитель в GF(p) и GF(2n) Подход 1: модифицированные FA / HA FSEL A B Cin FSEL A FA Cout B FSEL = 1 - умножение в GF(p) FSEL = 0 - умножение в GF(2n) HA S Cout S Оптимизация дерева умножителя с учетом различия задержек по разным входам FA/HA A B Cout Cin S B Cout 3 xor B Cout 2 xor A A Cin S 3 xor Cin A S B Cout Cin S B Cout Cin S A B Cout 3 xor B Cout 2 xor 1 xor A A Cin S 4 xor Cin S 1 xor A B Cout Cin S Умножитель в GF(p) и GF(2n) Подход 2: специальное построение дерева ai * bj w2 carry carry FA / HA array sum FA / HA array sum ... Wallace tree carry FA / HA array sum Final adder 2w Результат в GF(p) 2w - 1 Результат в GF(2n) Умножитель в GF(p) и GF(2n) Подход 3: использование умножителя из DesignWare IP Synopsys DesignWare DW02_mult (обычный умножитель) A w A B B Синтезируемое verilog-описание для умножителя в GF(2n) w A B x 2w Результат в GF(p) 2w - 1 Результат в GF(2n) Умножитель в GF(p) и GF(2n) Сравнение подходов для умножителя 64x64 бит Умножитель Монтгомери Базовый блок montmul_unit (64 бит) A[i] B[j] P[i] M[i] / M’0 precalc x x U + + C S (C, S) = C + A[i]*B[j] + P[i] + M[i]*U P[i-1] Умножитель Монтгомери Организация конвейера MEMORY MEMORY MEMORY MEMORY B[j] стадии задержки A[i] M[i] P[i] FSM montmul unit montmul unit montmul unit FSM FSM FSM result Умножитель Монтгомери Выбор параметров конвейера: быстродействие Две 64-битных стадии дают ускорение примерно в 4 раза для ECC и в 8 раз для RSA по сравнению с программной реализацией (все операнды на регистрах, операции в GF(p)). Умножитель Монтгомери Выбор параметров конвейера: площадь Возведение в степень по модулю Вычисление «в лоб» AB mod M = A * A * A * … * A mod M [!] 2n операций умножения по модулю если B – n-битное число Быстрое возведение в степень (Square & multiply) x19 - ? 19 : 100112 = (2 * 2 * 2 + 1) * 2 + 1 x19 = (((x2)2)2 * x)2 * x В среднем n + n/2 операций умножения Вычисление обратного значения по модулю Малая теорема Ферма: A-1 mod M = AM - 2 mod M если M – простое число Сложение в группе точек на эллиптической кривой над полем GF(p) y2 = x3 + a*x + b mod M P = (x1, y1), Q = (x2, y2), P ≠ Q Сложение точек: P + Q = (x3, y3) Удвоение точки: 2*P = (x3, y3) λ = (y2 – y1) / (x2 – x1) mod M x3 = λ2 – x1 – x2 mod M y3 = λ* (x1 – x3) – y1 mod M λ = (3*x12 + a) / (2 * y1) mod M x3 = λ2 – x1 mod M y3 = λ* (x1 – x3) – y1 mod M Операция деления (т.е. вычисления обратного по модулю) – медленная Для ускорения вычислений используются проекционные координаты Сложение в группе точек на эллиптической кривой над полем GF(p) Проекционные координаты Переход к проекционным координатам (x, y) -> (x, y, 1) Возврат к обычному представлению (X, Y, Z) -> (X/Z2, Y/Z3) Вычисление обратного по модулю только на этапе возврата к обычному представлению Сложение точек: λ1 = X1 * Z22 λ2 = X2 * Z12 λ3 = λ1 – λ2 λ4 = Y1 * Z23 λ5 = Y2 * Z13 λ6 = λ4 – λ5 λ7 = λ1 + λ2 λ8 = λ4 + λ5 Z3 = Z1*Z2* λ3 X3 = λ62 – λ7* λ32 λ9 = λ7 * λ32 – 2 * X3 Y3 = (λ9 * λ6 – λ8 * λ33) / 2 Итого: 16 умножений Архитектура сопроцессора MEMORY MEMORY MEMORY MEMORY 3.1 kb Sequencer block data bus Adder / Subtracter Montgomery Multiplier Level 3 EC add/sub/double scalar mult Level 2 control mod exp Level 1 mod add/sub/mult System interface Результаты работы Разработано verilog-описание и произведён синтез криптографического сопроцессора для микропроцессора «Эльбрус», позволяющего аппаратно ускорить выполнение алгоритмов шифрования с открытым ключом. Особенности: Поддержка современных алгоритмов шифрования с открытым ключом, включая алгоритмы на эллиптических кривых Масштабируемость – размеры операндов ограничены только объёмом памяти. Эффективность (умножение по модулю в 4-8 раз быстрее программной реализации) Основные характеристики: Тактовая частота 500 MHz (90nm) 3.1 kb внутренней памяти – поддержка до 4096 бит RSA и до 571 бит ECC Площадь ~ 1.2мм2