POLY1305-AES

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис

POLY1305-AESкод аутентификации сообщения (англ. MAC) ,разработанный Даниэлем Дж. Бернштейном[англ.]. Является комбинацией POLY-1305 и AES-128 , и как любой код аутенфикации, POLY1305-AES[1] можно использовать для проверки целостности данных и подлинности сообщения.

Poly1305-AES вычисляет 16-байтовый аутентификатор сообщения любой длины, используя 16-байтовый одноразовый номер (уникальный номер сообщения) и 32-байтовый секретный ключ.

AES используется для шифрования одноразового номера, чтобы получить уникальную (и секретную) 128-битную строку, но при желении AES-128 можно заменить любой другой функцией c гарантией безопасности, например ChaCha20.

Обзор

Аргументы POLY1305-AES

Poly1305-AES получает на вход[2]

Сообщение произвольной длины [math]\displaystyle{ m }[/math]
16-байтовый ключ [math]\displaystyle{ \mathrm{AES}_k }[/math]
16-байтовый дополнительный ключ [math]\displaystyle{ r }[/math]
16-байтовое однократно используемое число [math]\displaystyle{ n }[/math].

и вычисляет 16-байтовый аутентификатор [math]\displaystyle{ \operatorname{Poly1305}_r (m, AES_k(n)) }[/math].

Ключ [math]\displaystyle{ r }[/math] представляет собой 128-битное целое число r с прямым порядком байтов от младшего к старшему (англ. little-endian ), т.е. [math]\displaystyle{ r = r[0]+ 2^8r[1]+...+2^{120}r[15] }[/math]. При этом ключ [math]\displaystyle{ r }[/math] должен соответсвовать определённым требованиям: у [math]\displaystyle{ r[3] }[/math], [math]\displaystyle{ r[7] }[/math], [math]\displaystyle{ r[11] }[/math] и [math]\displaystyle{ r[15] }[/math] первые 4 из 8 битов должны быть равны 0, а у [math]\displaystyle{ r[4] }[/math], [math]\displaystyle{ r[8] }[/math] и [math]\displaystyle{ r[12] }[/math] последние 2 бита должны быть равны 0. Таким образом [math]\displaystyle{ r }[/math] может принять [math]\displaystyle{ 2^{106} }[/math] различных значений

Алгоритм

  1. Poly1305 разбивает сообщение [math]\displaystyle{ m = (m[0], m[1], \ldots, m[L-1]) }[/math] на фрагменты длиной 16 байт.
  2. К каждому 16-байтовому фрагмент сообщения добавляется единица до 17 байт для использования в качестве коэффициента полинома. Если последний фрагмент сообщения размером от 1 до 15 байт, то к фрагменту добавляется единица, а дальше до 17 байт всё заполняется нулями. Коэффициенты [math]\displaystyle{ c_1,\ldots,c_q }[/math] полинома [math]\displaystyle{ c_1r^q + c_2r^{q-1} + \ldots + c_qr^1 }[/math] , где [math]\displaystyle{ q = \left[ {L\over 16} \right] }[/math] вычисляются по формуле:
    [math]\displaystyle{ c_i = m[16i - 16] + 2^8 m[16i - 15] + 2^{16} m[16i - 14] + \cdots + 2^{120} m[16i - 1] + 2^{128} }[/math].
    Если [math]\displaystyle{ L }[/math] не делится нацело на 16, то используют формулу:
    [math]\displaystyle{ c_q = m[16q - 16] + 2^8 m[16q - 15] + \cdots + 2^{8(L \bmod 16) - 8} m[L - 1] + 2^{8 (L \bmod 16)}. }[/math]
  3. Полином вычисляется в точке [math]\displaystyle{ r }[/math] по модулю [math]\displaystyle{ 2^{130}-5 }[/math] и складывается с 16-байтной зашифрованной строкой , полученной на выходе [math]\displaystyle{ \mathrm{AES}_k(n) }[/math], где [math]\displaystyle{ n }[/math] -однократно используемое число.[math]\displaystyle{ (((c_1r^q + c_2r^{q-1} + \ldots + c_qr^1)\mathrm{mod}2^{130}-5)+ \mathrm{AES}_k(n) }[/math]
  4. Берём остаток от деления на [math]\displaystyle{ 2^{128} }[/math] и закодируем его, получив хэш длиной 16 байт.

Выбор стуктурных элементов при разработке алогритма

Изначально для деления по модулю рассматривались простые числа больше [math]\displaystyle{ 2^{128} }[/math] (128 битов – длина фрагмента сообщения). Для простоты вычислений было решено выбрать простое число [math]\displaystyle{ 2^{130}-5 }[/math].

Причин, по которым алгоритм использует однократно используемое число [math]\displaystyle{ n }[/math] несколько: Во-первых, вероятность взлома протоколов, не использующих такие числа [math]\displaystyle{ n }[/math] можно выразить формулой: [math]\displaystyle{ \frac{C(C + D)L}{2^{106}} }[/math], где [math]\displaystyle{ C }[/math] количество сообщений, [math]\displaystyle{ D }[/math] – количество попыток взлома, [math]\displaystyle{ L }[/math] -максимальная длина сообщения. А с однократно используемым числом вероятность будет такая: [math]\displaystyle{ \frac{DL}{2^{106}} }[/math]. Во-вторых, одноразовые номера позволяют проводить выполнение алгоритма AES-128 параллельно с другими операциями Poly1305-AES, что уменьшает общее время вычисления аутентификатора. В-третьих, большинство протоколов так или иначе имеют такие одноразовые номера для более безопасного шифрования.

Длина дополнительного ключа [math]\displaystyle{ r }[/math] была ограничена 16-ю байтами для ускорения вычислений. При этом возможен ключ длинее для усиления безопасности, но текущая вероятность взлома достаточно низкая, чтобы считать алгоритм при текущей длине ключа безопасным. Но при увеличении длины ключа, общее время вычисления будет слишком долгим, что лишит POLY1305-AES преимущества перед другими алгоритмами. Так же для ключа был выбран прямой порядок байтов, вместо обратного (англ. Big-endian), так как он экономит время на самых популярных процессорах.

Алгоритм POLY1305, написанный на псевдокоде

      clamp(r): r &= 0x0ffffffc0ffffffc0ffffffc0fffffff
      poly1305_mac(msg, key):
         r = le_bytes_to_num(key[0..15])
         clamp(r)
         s = le_bytes_to_num(key[16..31])
         a = 0  /* a is the accumulator */
         p = (1<<130)-5
         for i=1 upto ceil(msg length in bytes / 16)
            n = le_bytes_to_num(msg[((i-1)*16)..(i*16)] | [0x01])
            a += n
            a = (r * a) % p
            end
         a += s
         return num_to_16_le_bytes(a)
         end
ChaCha20 and Poly1305 for IETF Protocols, IRTF

[3]

Криптостойкость

Принято считать, что безопасность POLY1305-AES гарантирована, если можно гарантировать безопасность алгоритма AES. Если у злоумышленника есть [math]\displaystyle{ C }[/math] зашифрованных сообщений и он совершает D попыток взлома сообщений длиной не больше [math]\displaystyle{ L }[/math] байтов, [math]\displaystyle{ \delta }[/math] - вероятность взлома AES, то вероятность взлома POLY1305-AES будет [math]\displaystyle{ \delta + \frac{(1 - C/2^{128})^{-(C + 1)/2} \cdot 8 D \lceil L/16\rceil}{2^{106}}. }[/math] Рассмотрим случай, когда сообщения представляют из себя пакеты длиной до 1536 байт, злоумышленник имеет [math]\displaystyle{ 2^{64} }[/math] сообщений зашифрованных POLY1305-AES и совершает [math]\displaystyle{ 2^{64} }[/math] попыток взломать, а вероятность взлома[math]\displaystyle{ \delta \leq 2^{-40} }[/math] . В таком случае вероятность, что злоумышленник не сможет взломать код аутентификации послания [math]\displaystyle{ \geq 0.999999999998 }[/math][4]. Для сравнения, при таких параметрах можно легко взломать другие 16-байтные MAC, например CBC-AES, HMAC-MD5 и DMAC-A.

Скорость

Poly1305-AES можно вычислять с чрезвычайно высокой скоростью, например для AMD Athlon требуется менее 3.1n + 780 циклов для сообщения длиной n байт. Даниэль Дж. Бернштейн опубликовал исходный код на SPARC, AIX, macOS, Pentium Pro/II/III/M и Athlon. А также эталонную реализацию алгоритма на C, C++, Python и Perl[5].

Иплементация

Ниже представлен список криптографических библиотек, в которых есть реализация Poly1305:

Примечания

  1. Chapter 7: Keyed Hashing // Serious Cryptography: A Practical Introduction to Modern Encryption. — No Starch Press, 2018. — P. 136-138. — ISBN 978-1-59327-826-7.
  2. The Poly1305-AES message-authentication code. — 2005.
  3. Y. Nir. 2.5.1 // ChaCha20 and Poly1305 for IETF Protocols / Y. Nir, Dell EMC, A. Langley. — Internet Research Task Force, 2018. — P. 16.
  4. The Poly1305-AES message-authentication code 5.
  5. How does the Poly1305-AES implementation work?.

Ссылки

См. также