Speck

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Speck
Speck block cipher.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).

В 2017 году стало известно, что шифры АНБ Speck и Simon получили отказ в стандартизации от организации ISO[2]. Однако в октябре 2018 года стандарт всё же был принят[3].

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

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

Размер блока (бит) Размер ключа (бит) Раундов
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]).[4]

#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 соответственно.

Если ключ состоит более чем из 2 слов, в коде должно быть 2 или 3 значения a, используемых в сдвигах.

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

Дифференциальный криптоанализ может взломать 17 раундов Speck128/128 с 2113 данных, 222 байтов памяти и сложностью по времени в 2113.[5] Атака «Rectangle attack» (прямоугольная атака, вариация метода бумеранга) может взломать 18 раундов Speck128/192,256 с 2121.9 данных, 2125.9 байтов памяти и сложностью по времен в 2182.7.[6]

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

  1. Schneier, Bruce Schneier on Security (1 July 2013). Проверено 17 июля 2013.
  2. Joseph Menn. Distrustful U.S. allies force spy agency to back down in encryption fight (англ.), Reuters (SEP 21, 2017). Проверено 18 ноября 2017.
  3. ISO/IEC 29167-22:2018.
  4. 1 2 The Simon and Speck Families Of Lightweight Block Ciphers (19 June 2013). Проверено 29 января 2014.
  5. Dinur, Itai Improved Differential Cryptanalysis of Round-Reduced Speck (31 August 2014). Проверено 9 мая 2014.
  6. Cryptanalysis of the Speck Family of Block Ciphers (9 October 2013). Проверено 11 апреля 2014.

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

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