- •Симметричные шифры
- •1.1 Введение
- •1.2 Криптографическая система
- •1.3 Принципы Керкхоффса
- •Система не должна быть секретной, и если она попадёт в руки противника, это не должно причинить неудобства.
- •1.4 Классификация симметричных шифров
- •1.5 Шифры перестановки
- •1.6 Шифры замены
- •1.6.1 Шифры сдвига
- •1.7 Композиционные шифры
- •1.7.1 Алгебра секретных систем
- •1.7.2 Теория композиционных шифров
- •1.7.3 Сеть Файстеля (Feistel’s network)
- •1.7.4 Sp сети
- •Режимы использования блочных шифров ecb (Electronic Code Book). Режим простой замены
- •Cbc (Cipher Block Chaining). Режим выработки имитовставки
- •Ofb (Output FeedBack). Режим обратной связи по выходу
- •Cfb (FeedBack). Режим гаммирования с обратной связью
- •Ctr (Counter). Режим счетчика
- •Выработка вектора инициализации (IV)
- •Генераторы псевдослучайных последовательностей
- •Криптографические
- •Некриптографические
- •Поточные шифры
- •Абсолютно стойкий шифр
- •Гост 28147-89
-
Поточные шифры
Вообще говоря, основное отличие поточных шифров от блочных состоит в том, что они обладают памятью предыдущего состояния, на основе которой формируется ключ для текущего атомарного элемента исходного текста. У блочных шифров нет памяти предыдущего состояния, а ключевая последовательность (итерационные подключи) вырабатываются из основного ключа.
Сами поточные шифры разделяют на синхронные и самосинхронизирующиеся. Такое деление обусловлено непосредственно их поведением.
В синхронных поточных шифрах (Рисунок 2.4) каждый элемент шифруется независимо от других элементов, т.е. входная последовательность не участвует в формировании гаммы.
Свойства синхронных поточных шифров:
-
Отсутствие размножения ошибок (если на входе поменять один бит, то на выходе также будет изменен лишь один бит).
-
Выпадение или внедрение бита информации приводит к нарушению синхронизации, и, как следствию, некорректному расшифрованию всех последующих элементов.
Рисунок 2.4 Синхронный поточный шифр
В отличие от синхронных, самосинхронизирующиеся поточные шифры (Рисунок 2.5) формируют ключевую последовательность для шифрования каждого элемента с учетом N предыдущих элементов.
Свойства самосинхронизирующихся поточных шифров:
-
Наличие эффекта размножение ошибок.
-
Самосинхронизация происходит через N элементов автоматически (повреждение при передаче информации приведет к некорректному расшифрованию N элементов).
Рисунок 2.5 Самосинхронизирующийся поточный шифр
Абсолютно стойкий шифр
Абсолютно стойкий шифр или, как его называют по-другому, одноразовый шифр-блокнот интересен, по большей части, лишь с теоретической точки зрения.
Необходимые и достаточные условия абсолютной стойкости, сформулированные К. Шенноном:
-
Ключ является фрагментом истинно случайной двоичной последовательности с равномерным законом распределения.
-
Длины ключа и открытого текста совпадают.
-
Ключ используется лишь один раз, после чего сразу подлежит уничтожению.
Шеннон доказал абсолютную стойкость шифра, удовлетворяющего вышеприведенным условиям, показав, что криптоаналитик, располагая бесконечными вычислительными и временными ресурсами, не в состоянии получить какую-либо информацию об исходном тексте или используемом ключе. На практике такие схемы практически не используются, т.к. реализация их очень дорога и непрактична, что обусловлено, прежде всего, равенством ключа и передаваемой информации.
В 1917г. Гилберт Вернам запатентовал шифр, основанной на операции xor, который впоследствии стал называться шифром Вернама или одноразовым шифром-блокнотом. Ключ его и пересылаемое сообщение были одинаковой длины. Соответствующие биты ключа и исходного текста просто складывались по модулю 2, образуя зашифрованный текст (Рисунок 2.5).
Рисунок 2.5 Самосинхронизирующийся поточный шифр
-
RC4
Рисунок 2.5 Самосинхронизирующийся поточный шифр
typedef struct { uint8 state[256]; uint8 a_reg; uint8 b_reg; } RC4_KEY;
void setup_rc4(RC4_KEY *key, uint8 *pass, uint16 passlen) { uint8 *state = &key->state[0]; uint8 a = 0, b = 0, tmp; int i;
for (i = 0; i < 256; i++) key->state[i] = i; key->a_reg = 0; key->b_reg = 0; for (i = 0; i < 256; i++) { b = pass[a] + state[i] + b; xchg_pair(state+i, state+b); a = (a + 1) % passlen; } }
void encode_rc4(RC4_KEY *key, uint8 *buf, uint32 buflen) { uint8 a_reg = key->a_reg, b_reg = key->b_reg; uint8 xor, tmp, *state = &key->state[0];
while (buflen--) { a_reg++; b_reg = (state[a_reg] + b_reg); xchg_pair(&state[a_reg], &state[b_reg]); xor = state[a_reg] + state[b_reg]; *buf++ ^= state[xor]; } key->a_reg = a_reg; key->b_reg = b_reg; } |