какая размерность ключевой информации в стандарте шифрования гост 28147 89
ГОСТ 28147-89 (Часть 1. Введение и общие принципы)
Очень часто на Хабре встречаются статьи о сути, программных реализациях, вскрытиях шифров. Но непонятно одно: почему среди них нет наших, отечественных алгоритмов шифрования?
Я решил исправить это, написав повесть статью, разбитую на 5 частей для лучшего восприятия о стандарте ГОСТ 28147-89. Каждая часть, кроме первой (описывает схему алгоритма и общие принципы), повествует о каждом из четырех возможных режимах работы стандарта с приложением к ним кода на C++.
Описание алгоритма
ГОСТ 28147-89 является отечественным блочным шифром. То есть открытый текст разбивается на блоки (в данном случае 64 бита), и каждый блок преобразовывается отдельно.
В основу алгоритма положена сеть Фейстеля, представленная на рисунке ниже.
Поясню работу данной схемы.
Структурная схема алгоритма
Данная схема содержит:
Ключи
В КЗУ
КЗУ отведено 256 бит, в ГОСТ 28147-89 используется ключ длиной 256 бит. Ключ разбивается на восемь блоков по 32 бита, и каждый бит каждого блока последовательно вводится в накопитель X соответствующего порядка.
То есть, 1-й бит ключа вводится в 1-й разряд накопителя X0, 2-й — во 2-й разряд накопителя X0, 33-й — в 1-й разряд накопителя X1, 65-й — в 1-й разряд накопителя X2, и так далее, 224-й бит ключа вводится в 1-й разряд накопителя X7, 256-й бит ключа вводится в 32-й разряд накопителя X7.
Считывается же ключ в соответствии с выбранным режимом работы алгоритма, но в следующих частях статьи.
В блоке подстановки K
Блок подстановки содержит в себе таблицу замены размерностью 16×8, которая является долговременным ключом.
Строки таблицы определяют, грубо говоря, что требуется заменить (число от 0 до 15 в шестнадцатиричной системе счисления). Столбцы же указывают, на что заменять. При этом поступающий 32-битовый в блок вектор разбивается на восемь 4-х битовых, каждый из которых и преобразуется в соответствии с таблицой замены.
Ключи как в КЗУ, так и в блоке К, являются секретными, и требуются меры по недопущению их компрометации.
Режимы работы
UPD: Следующая часть статьи «Режим простой замены» доступен по ссылке.
Какая размерность ключевой информации в стандарте шифрования гост 28147 89
ГОСУДАРСТВЕННЫЙ СТАНДАРТ СОЮЗА ССР
СИСТЕМЫ ОБРАБОТКИ ИНФОРМАЦИИ. ЗАЩИТА КРИПТОГРАФИЧЕСКАЯ
Алгоритм криптографического преобразования
Дата введения 1990-07-01
1. УТВЕРЖДЕН И ВВЕДЕН В ДЕЙСТВИЕ Постановлением Государственного комитета СССР по стандартам от 02.06.89 N 1409
3. ССЫЛОЧНЫЕ НОРМАТИВНО-ТЕХНИЧЕСКИЕ ДОКУМЕНТЫ
Обозначение НТД, на который дана ссылка
4. ПЕРЕИЗДАНИЕ, апрель 1996 г.
Настоящий стандарт устанавливает единый алгоритм криптографического преобразования для систем обработки информации в сетях электронных вычислительных машин (ЭВМ), отдельных вычислительных комплексах и ЭВМ, который определяет правила шифрования данных и выработки имитовставки.
Алгоритм криптографического преобразования предназначен для аппаратной или программной реализации, удовлетворяет криптографическим требованиям и по своим возможностям не накладывает ограничений на степень секретности защищаемой информации.
Стандарт обязателен для организаций, предприятий и учреждений, применяющих криптографическую защиту данных, хранимых и передаваемых в сетях ЭВМ, в отдельных вычислительных комплексах или в ЭВМ.
Термины, применяемые в настоящем стандарте, и их определения приведены в приложении 1.
1. СТРУКТУРНАЯ СХЕМА АЛГОРИТМА КРИПТОГРАФИЧЕСКОГО ПРЕОБРАЗОВАНИЯ
1.1. Структурная схема алгоритма криптографического преобразования (криптосхема) содержит (см. черт.1):
32-разрядный сумматор поразрядного суммирования по модулю 2 ( );
сумматор по модулю 2( ), ограничение на разрядность сумматора не накладывается;
регистр циклического сдвига на одиннадцать шагов в сторону с
1.3. При сложении и циклическом сдвиге двоичных векторов старшими разрядами считаются разряды накопителей с большими номерами.
Заполнение таблиц блока подстановки является долговременным ключевым элементом, общим для сети ЭВМ.
Организация различных видов связи достигается построением соответствующей ключевой системы. При этом может быть использована возможность выработки ключей (заполнений КЗУ) в режиме простой замены и зашифрования их в режиме простой замены с обеспечением имитозащиты для передачи по каналам связи или хранения в памяти ЭВМ.
1.8. В криптосхеме предусмотрены четыре вида работы:
зашифрование (расшифрование) данных в режиме простой замены;
зашифрование (расшифрование) данных в режиме гаммирования;
зашифрование (расшифрование) данных в режиме гаммирования с обратной связью;
режим выработки имитовставки.
Схемы программной реализации алгоритма криптографического преобразования приведены в приложении 3.
2. РЕЖИМ ПРОСТОЙ ЗАМЕНЫ
2.1. Зашифрование открытых данных в режиме простой замены
2.1.1. Криптосхема, реализующая алгоритм зашифрования в режиме простой замены, должна иметь вид, указанный на черт.2.
Какая размерность ключевой информации в стандарте шифрования гост 28147 89
НАЦИОНАЛЬНЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИ
КРИПТОГРАФИЧЕСКАЯ ЗАЩИТА ИНФОРМАЦИИ
Information technology. Cryptographic data security. Hash-function
Дата введения 2013-01-01
Сведения о стандарте
2 ВНЕСЕН Техническим комитетом по стандартизации ТК 26 “Криптографическая защита информации”
4 ВЗАМЕН ГОСТ Р 34.11-94
ВНЕСЕНА поправка, опубликованная в ИУС N 6, 2018 год
Поправка внесена изготовителем базы данных
Введение
Настоящий стандарт содержит описание алгоритма и процедуры вычисления хэш-функции для любой последовательности двоичных символов, которые применяются в криптографических методах защиты информации, в том числе в процессах формирования и проверки электронной цифровой подписи.
Стандарт разработан взамен ГОСТ Р 34.11-94. Необходимость разработки настоящего стандарта вызвана потребностью в создании хэш-функции, соответствующей современным требованиям к криптографической стойкости и требованиям стандарта ГОСТ Р 34.10-2012 к электронной цифровой подписи.
Настоящий стандарт терминологически и концептуально увязан с международными стандартами ИСО 2382-2 [1], ИСО/МЭК 9796 3, серии ИСО/МЭК 14888 5 и серии ИСО/МЭК 10118 10.*
Приложение А (справочное) Контрольные примеры.
1 Область применения
Настоящий стандарт определяет алгоритм и процедуру вычисления хэш-функции для любой последовательности двоичных символов, которые применяются в криптографических методах обработки и защиты информации, в том числе для реализации процедур обеспечения целостности, аутентичности, электронной цифровой подписи (ЭЦП) при передаче, обработке и хранении информации в автоматизированных системах.
Определенная в настоящем стандарте функция хэширования используется при реализации систем электронной цифровой подписи на базе асимметричного криптографического алгоритма по ГОСТ Р 34.10-2012.
Стандарт рекомендуется использовать при создании, эксплуатации и модернизации систем обработки информации различного назначения.
2 Нормативные ссылки
В настоящем стандарте использованы нормативные ссылки на следующие стандарты:
ГОСТ Р 34.10-2012 Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи
3 Термины, определения и обозначения
В настоящем стандарте применены следующие термины с соответствующими определениями.
3.1 Термины и определения
заполнение (padding): Приписывание дополнительных бит к строке бит.
[ИСО/МЭК 10118-1, статья 3.9]
инициализационный вектор (initializing value): Вектор, определенный как начальная точка работы функции хэширования.
[ИСО/МЭК 10118-1, статья 3.7]
сообщение (message): Строка бит произвольной конечной длины.
[ИСО/МЭК 14888-1, статья 3.10]
[ИСО/МЭК 10118-1, статья 3.10]
хэш-код (hash-code): Строка бит, являющаяся выходным результатом хэш-функции.
[ИСО/МЭК 14888-1, статья 3.6]
хэш-функция (collision-resistant hash-function): Функция, отображающая строки бит в строки бит фиксированной длины и удовлетворяющая следующим свойствам:
1) по данному значению функции сложно вычислить исходные данные, отображаемые в это значение;
2) для заданных исходных данных сложно вычислить другие исходные данные, отображаемые в то же значение функции;
3) сложно вычислить какую-либо пару исходных данных, отображаемых в одно и то же значение.
[ИСО/МЭК 14888-1, статьи 3.2, 3.7]
электронная цифровая подпись (signature); ЭЦП: Строка бит, полученная в результате процесса формирования подписи.
[ИСО/МЭК 14888-1, статья 3.12]
3.2 Обозначения
В настоящем стандарте используются следующие обозначения:
операция покомпонентного сложения по модулю 2 двух двоичных векторов одинаковой размерности;
конкатенация экземпляров вектора ;
кольцо вычетов по модулю 2 ;
операция сложения в кольце ;
операция присваивания переменной значения ;
произведение отображений, при котором отображение действует первым;
двоичный вектор, подлежащий хэшированию, 

функция хэширования, отображающая вектор (сообщение) в вектор (хэш-код) 
инициализационный вектор функции хэширования, 
4 Общие положения
Настоящий стандарт определяет две функции хэширования 
ТЕМА 5. ОТЕЧЕСТВЕННЫЙ СТАНДАРТ ШИФРОВАНИЯ ПО ГОСТ 28147–89
Цели и задачи изучения темы:
Оглавление:
5.1. Принципы построения алгоритма шифрования
Рассмотрим один из наиболее актуальных в настоящее время алгоритмов шифрования информации – отечественный стандарт ГОСТ 28147-89 «Системы обработки информации. Защита криптографическая. Алгоритм криптографического преобразования».
Несмотря на то, что ГОСТ 28147-89 был принят еще в 1989 году, он и в наши дни является весьма широко используемым как в России, так и в мире в целом.
Во-первых, этому способствует отечественное законодательство. Государственные организации и ряд коммерческих обязаны использовать для защиты информации только сертифицированные криптосредства, а получение сертификата подразумевает, что «в указанных криптосредствах реализованы криптографические алгоритмы, объявленные государственными или отраслевыми стандартами Российской Федерации. ».
Во-вторых, данный алгоритм разрабатывался с огромным запасом в криптостойкости, причем с небольшим ущербом скорости шифрования.
Рис. 1. Схема алгоритма ГОСТ 28147–89.
Основное отличие алгоритмов симметричного шифрования друг от друга состоит именно в различных функциях обработки субблоков. Данная функция часто называется «основным криптографическим преобразованием», поскольку именно она несет основную нагрузку при шифровании информации.
5.2. Основной шаг и базовые циклы криптопреобразований по ГОСТ 28147-89
Основное преобразование алгоритма ГОСТ 28147–89 является достаточно простым, что обеспечивает высокое быстродействие алгоритма; в нем выполняются следующие операции (см. рис. 2):
Рис. 2. Основное преобразование алгоритма ГОСТ 28147–89.
Если внимательно изучить ГОСТ 28147–89, то можно заметить, что в нем содержится описание алгоритмов нескольких уровней. На самом верхнем находятся практические алгоритмы, предназначенные для шифрования массивов данных и выработки для них имитовставки. Все они опираются на три алгоритма низшего уровня, называемые в тексте ГОСТа циклами. Эти фундаментальные алгоритмы названы здесь базовыми циклами для того, чтобы отличить их от всех прочих циклов. Они имеют следующие названия и обозначения. Последние приведены в скобках и смысл их будет объяснен позже:
В свою очередь, каждый из базовых циклов представляет собой многократное повторение одной единственной процедуры, называемой далее основным шагом криптопреобразования.
Таким образом, для того чтобы разобраться в ГОСТе, надо осознать следующее:
Прежде чем перейти к изучению этих вопросов, следует поговорить о ключевой информации, используемой алгоритмами ГОСТа. В соответствии с принципом Киркхоффса, которому удовлетворяют все современные известные шифры, именно ее секретность обеспечивает секретность зашифрованного сообщения. В ГОСТе ключевая информация состоит из двух структур данных. Помимо собственно ключа, необходимого для всех шифров, она содержит еще и таблицу замен. Ниже приведены основные характеристики ключевых структур ГОСТа.
Основной шаг криптопреобразования по своей сути является оператором, определяющим преобразование 64-битового блока данных. Дополнительным параметром этого оператора является 32-битовый блок, в качестве которого используется какой-либо элемент ключа. Число повторений основного шага криптопреобразования (число раундов) n=32. Ниже даны пояснения к алгоритму основного шага.
Шаг 0. Определяет исходные данные для основного шага криптопреобразования:
N – преобразуемый 64-битовый блок данных, в ходе выполнения шага его младшая (N 1) и старшая (N 2) части обрабатываются как отдельные 32-битовые целые числа без знака. Таким образом, можно записать N=(N 1, N 2); X – 32-битовый элемент ключа.
Шаг 1. Сложение с ключом. Младшая половина преобразуемого блока складывается по модулю 2** 32 с используемым на шаге элементом ключа, результат передается на следующий шаг.
Шаг 2. Поблочная замена. 32-битовое значение, полученное на предыдущем шаге, интерпретируется как массив из восьми 4-битовых блоков кода: S = (S 0, S 1, S 2, S 3, S 4, S 5, S 6, S 7).
Далее значение каждого из восьми блоков заменяется новым, которое выбирается по таблице замен следующим образом: значение блока S i меняется на S i-й по порядку элемент (нумерация с нуля) i-го узла замен (т. е. i-й строки таблицы замен, нумерация также с нуля). Другими словами, в качестве замены для значения блока выбирается элемент из таблицы замен с номером строки, равным номеру заменяемого блока, и номером столбца, равным значению заменяемого блока как 4-битового целого неотрицательного числа. Теперь становится понятным размер таблицы замен: число строк в ней равно числу 4-битовых элементов в 32-битовом блоке данных, то есть восьми, а число столбцов равно числу различных значений 4-битового блока данных, равному как известно 2 4, шестнадцати.
Шаг 3. Циклический сдвиг на 11 бит влево. Результат предыдущего шага сдвигается циклически на 11 бит в сторону старших разрядов и передается на следующий шаг.
Шаг 4. Побитовое сложение: значение, полученное на шаге 3, побитно складывается по модулю 2 со старшей половиной преобразуемого блока.
Шаг 5. Сдвиг по цепочке: младшая часть преобразуемого блока сдвигается на место старшей, а на ее место помещается результат выполнения предыдущего шага.
Шаг 6. Полученное значение преобразуемого блока возвращается как результат выполнения алгоритма основного шага криптопреобразования.
Базовые циклы криптографических преобразований. Поскольку ГОСТ относится к классу блочных шифров, т. е. единицей обработки информации в нем является блок данных. Следовательно, вполне логично ожидать, что в нем будут определены алгоритмы для криптографических преобразований, т. е. для зашифрования, расшифрования и «учета» в контрольной комбинации одного блока данных. Именно эти алгоритмы и называются базовыми циклами ГОСТа, что подчеркивает их фундаментальное значение для построения этого шифра.
Базовые циклы построены из основных шагов криптографического преобразования, рассмотренного ранее. В процессе выполнения основного шага используется только один элемент ключа, в то время как ключ ГОСТа содержит восемь таких элементов. Следовательно, для того, чтобы ключ был использован полностью, каждый из базовых циклов должен многократно выполнять основной шаг с различными его элементами. Вместе с тем кажется вполне естественным, что в каждом базовом цикле все элементы ключа должны быть использованы одинаковое число раз, по соображениям стойкости шифра это число должно быть больше одного.
Все сделанные выше предположения, опирающиеся просто на здравый смысл, оказались верными. Базовые циклы заключаются в многократном выполнении основного шага с использованием разных элементов ключа и отличаются друг от друга только числом повторений шага и порядком использования ключевых элементов.
Ниже приведен этот порядок для различных циклов.
Из сказанного вытекает одно интересное следствие: свойство цикла быть обратным другому циклу является взаимным, т. е. цикл 32-З является обратным по отношению к циклу 32-Р. Другими словами, зашифрование блока данных теоретически может быть выполнено с помощью цикла расшифрования. В этом случае расшифрование блока данных должно быть выполнено циклом зашифрования. Из двух взаимно обратных циклов любой может быть использован для зашифрования, тогда второй должен быть использован для расшифрования данных, однако стандарт ГОСТ 28147–89 закрепляет роли за циклами и не предоставляет пользователю права выбора в этом вопросе.
Ещё раз о шифровании ГОСТ 28147-89
О реализации этого алгоритма шифрования уже рассказывал FTM: как в общем и целом, так и про режим простой замены. После изучения существующих библиотек и отдельных реализаций этого ГОСТа на C# я решил написать свой велосипед, в первую очередь, ради интереса и опыта. Результатами этой работы мне и хотелось бы поделиться с уважаемым сообществом.
ГОСТ 28147-89 — симметричный блочный алгоритм шифрования с 256-битным ключом, оперирует блоками данных по 64 бита.
Один из режимов его работы, гаммирования с обратной связью, является потоковым режимом блочного шифра.
Описание алгоритма
Реализация
Данный алгоритм был реализован в форме плагина к менеджеру паролей KeePass.
Исходники доступны на GitHub.
Гаммирование с обратной связью
Ниже приведён фрагмент кода класса, реализующего стандартный интерфейс ICryptoTransform, собственно выполняющий криптографическое преобразование данных поблочно. При создании экземпляра в атрибут _state записывается значение синхропосылки, в дальнейшем от направления работы (шифрование или расшифровывание) в него заносится очередной блок зашифрованных данных.
Режим простой замены
GostECB.Process — реализация того же ГОСТа в режиме простой замены, или «электронной кодовой книги». Хорошее описание алгоритма есть в соответствующем разделе статьи Википедии, а также в статье ГОСТ 28147-89 (Часть 2. Режим простой замены) на Хабрахабре.
Размер снихропосылки, гаммы и «состояния» равен 64 байтам, поэтому шифрование в режиме простой замены можно рассматривать в рамках одного блока. Впрочем, было бы несколько — они просто шифровались бы по очереди.
Для работы с 32-битными частями исходного блока очень удобно использовать тип uint.
Так, в функции F() сложение по модулю ключа и части блока, а также циклический сдвиг на 11 бит запишется просто и лаконично:
Метод подстановки по S-блокам работает с 4-битными кусочками 32-битного подблока, их достаточно удобно отделять побитовым сдвигом и дальнейшим умножением на 0x0f:
Шифрование от расшифровывания в режиме простой замены отличается порядком использования ключей. На самом деле, применительно к режиму гаммирования с обратной связью нам не надо ничего расшифровывать, однако для полноты реализации можно предусмотреть и эту возможность:









