Speck

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Speck
Speck block cipher 0 indexing.svg
Создатель АНБ
Опубликован 2013 г.
Размер ключа 64, 72, 96, 128, 144, 192 или 256 бит
Размер блока 32, 48, 64, 96 или 128 бит
Число раундов 22-34, зависит от размера блока и ключа
Тип ARX

Speck — семейство простых для реализации блочных шифров, опубликованное АНБ США в июне 2013 [1]. Шифры Speck оптимизированы для программных реализаций, тогда как опубликованный вместе с ним Simon оптимизирован для аппаратных реализаций. Speck относится к семейству ARX (англ. add-rotate-xor).

Варианты[править | править код]

Speck поддерживает несколько размеров блока и ключа. Блок представляет собой два слова, при этом слово может иметь размер 16, 24, 32, 48 или 64 бита. Ключ имеет размер 2, 3 или 4 слова. Раундовая функция состоит из нескольких стадий:

  1. Циклический сдвиг первого слова вправо на 8 бит;
  2. Сложение второго слова с первым по модулю 2 в степени длины слова;
  3. Операция XOR ключа и результата сложения;
  4. Циклический сдвиг второго слова влево на 3 бита;
  5. Операция XOR второго слова и результата предыдущего XOR.

Количество раундов зависит от выбранных размеров слова и ключа:[2]

Размер блока (бит) Размер ключа (бит) Раундов
2×16 = 32 4×16 = 64 22
2×24 = 48 3×24 = 72 22
4×24 = 96 23
2×32 = 64 3×32 = 96 26
4×32 = 128 27
2×48 = 96 2×48 = 96 28
3×48 = 144 29
2×64 = 128 2×64 = 128 32
3×64 = 192 33
4×64 = 256 34

Для выработки ключей (развёртки ключа (англ. key schedule)) используется та же раундовая функция.

Реализация[править | править код]

Разработчиками шифра в IACR ePrint была опубликована эталонная реализация Speck с 128-битным блоком и ключом. Ключ обозначен как key = (K[1], K[0]).[3]

#include <stdint.h>

#define ROR(x, r) ((x >> r) | (x << (64 - r)))
#define ROL(x, r) ((x << r) | (x >> (64 - r)))
#define R(x, y, k) (x = ROR(x, 8), x += y, x ^= k, y = ROL(y, 3), y ^= x)
#define ROUNDS 32

void encrypt(uint64_t const pt[static 2],
             uint64_t ct[static 2],
             uint64_t const K[static 2])
{
   uint64_t y = pt[0], x = pt[1], b = K[0], a = K[1];

   R(x, y, b);
   for (int i = 0; i < ROUNDS - 1; i++) {
      R(a, b, i);
      R(x, y, b);
   }

   ct[0] = y;
   ct[1] = x;
}

При реализации с 16-битными словами, вращения используют 7-битный циклический сдвиг вправо и 2-битный влево. Для остальных размеров слова, как показано в примере используются сдвиги 8 и 3 соответственно.

Эффективность[править | править код]

Согласно сравнительным тестам «легковесных» шифров, Speck является одним из самых быстрых доступных шифров, однако производительность сильно зависит от архитектуры. Некоторые усредненные показатели для 64-битной версии блока и ключа размером 128: Tmote(18 бит MSP) - 9780 циклов, Raspberry Pi (32 бит ARM) - 35 циклов, что гораздо меньше в сравнении с результатами AES: Tmote(18 бит MSP) - 25350 циклов, Raspberry Pi (32 бит ARM) - 254 цикла. При реализации на Arduino Uno(8 бит AVR) AES занимает 62208 циклов, а Speck - 64768.[4]

При реализации на 8-битном микроконтроллере AVR, Speck с 64-битными блоками и 128-битным ключом потребляет 192 байта Flash, временные переменные занимают 112 байтов ОЗУ и требуется 164 цикла для шифрования каждого байта в блоке. [5]

Salsa20 - это потоковый шифр с сопоставимой производительностью. Однако, часто возникают трудности с безопасным использованием потоковых шифров в некоторых приложениях, в то время как блочные шифры, такие как Speck, работают хорошо. Это привело к тому, что Google добавил реализацию Speck в ядро Linux версии 4.17, планируя предложить ее в качестве варианта для шифрования диска на тех устройствах Android, которые в противном случае были бы незашифрованы из-за низкой производительности AES на процессорах, в которых отсутствует расширение системы команд AES.[6] Speck был позже удален из ядра Linux и вместо этого Google переключился на алгоритм Adiantum.

Безопасность[править | править код]

Криптоанализ[править | править код]

Разработчики утверждают, что Speck, хотя и является «легковесным» шифром, спроектирован таким образом, чтобы обеспечить максимально возможную защищенность от стандартных атак на основе подобранного открытого текста и подобранного шифротекста. Сопротивление атакам на связанных ключах также было целью создания шифра, хотя и менее важной, поскольку атаки в этой модели не относятся к типичным.[7] Разработчиками не предпринимались попытки противостоять атакам с распознаванием по известному ключу. Кроме того, они не рассматривали использование Speck в качестве хеш-функции. [8]

По состоянию на 2018 год, не известно ни одной успешной атаки на варианты Speck с полным числом раундов. Из-за интереса к шифрам Simon и Speck было опубликовано около 70 работ по криптоанализу. [9] Как и для итеративных шифров, атаки на варианты с уменьшенным числом раундов были проведены успешно. Лучшими опубликованными атаками на Speck в стандартной модели атак являются атаки дифференциального криптоанализа; они перехватывают примерно 70–75% раундов большинства вариаций шифров, хотя эти лучшие атаки лишь незначительно быстрее, чем полный перебор. Команда разработчиков подбирала соответствующее количество раундов для фиксированной длины ключа так, чтобы при дифференциальных атаках сохранить запас прочности, аналогичный AES-128, примерно 30%.[10]

Лучшие опубликованные дифференциальные атаки на Speck в стандартной модели атак
Вариант Взломано раундов Сложность по времени Необходимые данные Байты памяти
Speck128/256 25/34 (74%) 2253.35 2125.35 222
Speck128/192 24/33 (73%) 2189.35 2125.35 222
Speck128/128 23/32 (72%) 2125.35 2125.35 222
Speck96/144 21/29 (72%) 2143.94 295.94 222
Speck96/96 20/28 (71%) 295.94 295.94 222
Speck64/128 20/27 (74%) 2125.56 261.56 222
Speck64/96 19/26 (73%) 293.56 261.56 222
Speck48/96 17/23 (74%) 295.8 247.8 222
Speck48/72 16/22 (73%) 271.8 247.8 222
Speck32/64 15/22 (68%) 263.39 231.39 222

Команда разработчиков Speck утверждает, что излишне большие запасы прочности сопряжены с реальными издержками, особенно на «легких» устройствах. Также они утверждают, что криптоанализ на этапе проектирования позволил правильно установить необходимое количество раундов и что это значение удовлетворяет запасу безопасности AES, поэтому Speck можно считать безопасным, даже с небольшим запасом прочности. [11]

Разработчики утверждают, что криптоанализ АНБ обнаружил, что алгоритм не имеет слабых мест и его безопасность соизмерима с длиной ключа.[12] Авторы говорят, что их методы криптоанализа включали линейный и дифференциальный криптоанализ с использованием стандартных методов, таких как алгоритм Мацуи и SAT/SMT solvers, хотя полный список не приводится.[9]

АНБ одобрило использование Simon128 / 256 и Speck128 / 256 в системах национальной безопасности США, хотя AES-256 по-прежнему рекомендуется для неограниченных применений. [13]

Атаки по побочным каналам[править | править код]

Speck не использует S-блоки(блоки подстановок) или другие таблицы поиска, поэтому он, естественно, неуязвим к атакам по времени. Это отличает его от шифров, использующих таблицы поиска, такие как AES, которые, как было показано, уязвимы для таких видов атак. Однако, как и большинство блочных шифров (включая AES), Speck уязвим для атак по энергопотреблению, если не приняты аппаратные контрмеры.[14]

Размеры блоков и ключей[править | править код]

Хотя семейство шифров Speck включает в себя варианты с теми же размерами блоков и ключей, что и AES (Speck128 / 128, Speck128 / 192 и Speck128 / 256), оно также включает варианты с размером блока до 32 бит и размером ключа до 64 бит. Эти небольшие размеры блоков и ключей небезопасны для общего использования, поскольку они могут быть уязвимы для атак «дней рождения» и атак методом полного перебора, независимо от формальной безопасности шифра.[15] Разработчики утверждают, что эти размеры блоков и ключей были добавлены для устройств с ограниченными ресурсами, где нет иных вариантов, или когда шифруются только очень небольшие объемы данных, например в протоколах RFID. Только вариант с 128-битным размером блока и 256-битным размером ключа одобрен для использования в системах национальной безопасности США.[13]

Усилия по стандартизации и противоречия[править | править код]

Первые попытки стандартизировать Simon и Speck не увенчались успехом, так как не было получено большинство голосов Международной организации по стандартизации, требуемое для этого решения. Эксперты-делегаты ISO из нескольких стран, включая Германию, Японию и Израиль, выступили против усилий АНБ по стандартизации шифров Simon и Speck, сославшись на то, что АНБ настаивает на их стандартизации, зная об уязвимых местах в шифрах. Позиция была основана на частичном подтверждении нахождения слабых мест в шифрах, отсутствия явной необходимости стандартизации новых шифров и предыдущего участия АНБ в создании и продвижении криптографического алгоритма Dual_EC_DRBG с резервным копированием[16].

После того, как первые попытки стандартизировать шифры потерпели неудачу, ISO стандартизировал Simon и Speck в других рабочих группах. По состоянию на октябрь 2018 года шифры Simon и Speck были стандартизированы ISO как часть стандарта радиоинтерфейса RFID, Международного стандарта ISO / 29167-21 (для Simon) и Международного стандарта ISO / 29167-22 (для Speck). Они стали доступны для использования коммерческими организациями.[17][18]

7 августа 2018 года Speck был полностью удален из версии ядра Linux 4.20.[19]

Примечания[править | править код]

  1. The SIMON and SPECK Families, 2013, с. 1.
  2. The SIMON and SPECK Families, 2013, с. 6.
  3. Perspectives of System Informatics: 12th International Andrei P. Ershov Informatics Conference, PSI 2019, Novosibirsk, Russia, July 2–5, 2019, Revised Selected Papers / Bjørner N., Virbitskaite I., Voronkov A.. — Springer International Publishing, 2019. — С. 249. — (Theoretical Computer Science and General Issues). — ISBN 978-3-030-37486-0.
  4. Shin S., Kim M., Kwon T. Experimental performance analysis of lightweight block ciphers and message authentication codes for wireless sensor networks (англ.) // International Journal of Distributed Sensor Networks. — 2017. — Vol. 13, iss. 11. — P. 8, 11. — ISSN 1550-1477. — doi:10.1177/1550147717744169.
  5. Beaulieu R., Shors D., Smith J., Treatman-Clark S., Weeks B.,Wingers L. The Simon and Speck Block Ciphers on AVR 8-bit Microcontrollers // National Security Agency. — 2014. — С. 15.
  6. speck - add support for the Speck block cipher. Linux kernel source tree. git.kernel.org (2018).
  7. Notes on the design SIMON and SPECK, 2018, с. 2.
  8. The SIMON and SPECK Families, 2013, с. 7-8.
  9. 1 2 Notes on the design SIMON and SPECK, 2018, с. 10.
  10. Notes on the design SIMON and SPECK, 2018, с. 12-13.
  11. The SIMON and SPECK Families, 2013, с. 6-7.
  12. Simon and Speck for the Internet of Things, 2015, с. 2.
  13. 1 2 NSA. [https://nsacyber.github.io/simon-speck/papers/Algorithms-to-Support-the-Evolution-of-Information-Assurance-Needs.pdf Algorithms to Support the Evolution of Information Assurance Needs]. — 2016. — 1 ноября. — С. 6.
  14. Simon and Speck for the Internet of Things, 2015, с. 12.
  15. Bhargavan K., Leurent G. On the Practical (In-)Security of 64-bit Block Ciphers // ACM. — 2016. — Октябрь. — С. 2-4.
  16. Distrustful U.S. allies force spy agency to back down in encryption fight, Reuters (21 сентября 2017). Дата обращения 13 декабря 2019.
  17. Crypto suite SIMON security services for air interface communications (англ.). ISO/IEC 29167-21. ISO (2018).
  18. Crypto suite SPECK security services for air interface communications (англ.). ISO/IEC 29167-22. ISO (2018).
  19. speck - remove Speck. Linux kernel source tree. git.kernel.org (2018).

Литература[править | править код]


Ссылки[править | править код]