Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA

Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA Сертификаты

1 Хэш-функции

Определение 9.1Хэш-функции – это функции, предназначенные для “сжатия” произвольного сообщения, записанного, как правило, в двоичном алфавите, в некоторую битовую последовательность фиксированной длины, называемую сверткой.

Хэш-функции применяются для тестирования логических устройств, для быстрого поиска и проверки целостности записей в базах данных.

В криптографии хэш-функции применяются для решения следующих задач:

При решении первой задачи для каждого набора данных вычисляется значение хеш-функции (называемое кодом аутентификации сообщения или имитовставкой), которое передается или хранится вместе с самими данными.

При получении данных пользователь вычисляет значение свертки и сравнивает его с имеющимся контрольным значением. Несовпадение говорит о том, что данные были изменены. При решении второй задачи, аутентификации источника данных, мы имеем дело с не доверяющими друг другу сторонами.

В связи с этим подход, при котором обе стороны обладают одним и тем же секретным ключом, уже не применим. В такой ситуации применяют схемы цифровой подписи, позволяющие осуществить аутентификацию источника данных. Как правило, при этом сообщение, прежде чем быть подписано личной подписью, основанной на секретном ключе пользователя, “сжимается” с помощью хеш-функции, выполняющей функцию кода обнаружения ошибок.

Определение 9.2Обозначим через X множество, элементы которого будем называть сообщениями, n – натуральное число. Хеш-функцией называется всякая легко вычислимая функция h: X rightarrow {0,1}^n.

Кроме того, хэш-функцию можно понимать, как отображение из множества сообщений в некоторое ограниченное подмножество целых неотрицательных чисел.

Обычно число возможных сообщений значительно превосходит число возможных значений сверток, в силу чего для каждого значения свертки имеется большое множество прообразов, то есть сообщений с заданным значением хеш-функции. Заметим, что при случайном и равновероятном выборе сообщений условие равномерности распределения значений хеш-функции эквивалентно наличию одинакового числа прообразов для каждого значения свертки.

Как правило, хеш-функции строят на основе так называемых одношаговых сжимающихся функцийy=f(x_1,x_2)x_1x_2mnnдлина свертки. Для получения значения h(M)Mmдлина сообщения не кратна mM_1, M_2,dots, M_Nvвектор. Если функцияfвектор можно положить равным нулевому вектору. Если же функцияfвектор можно составить из фрагментов указывающих на дату, время, номер сообщения и т.п.При таком подходе свойства хеш-функции hf

2.1 Общие положения

Появление криптографии с открытым ключом позволило решать задачи, которые ранее считались неразрешимыми. К таким задачам относится использование цифрового аналога собственноручной подписи абонента – электронной цифровой подписи (ЭЦП).

Цифровая подпись (ЭЦП) для сообщения является числом, зависящим от самого сообщения и от секретного ключа, известного только подписывающему. Важное требование: подпись должна допускать проверку без знания секретного ключа. При возникновении спорной ситуации, связанной с отказом от факта подписи либо с возможной подделкой подписи, третья сторона должна иметь возможность разрешить спор.

Задачи, которые решает подпись:

Для реализации схемы ЭЦП необходимы два алгоритма: алгоритм генерации подписи и алгоритм проверки. Надежность схемы ЭЦП определяется сложностью следующих задач:

Заметим, что между ЭЦП и собственноручной подписью имеются различия, хотя они и служат для решения одинаковых задач. Так, ЭЦП зависит от подписываемого текста, различна для разных тестов. Кроме того, ЭЦП требует дополнительных механизмов, реализующих алгоритмы ее вычисления и проверки.

Наконец, принципиальной сложностью, возникающей при использовании ЭЦП, является необходимость создания инфраструктуры открытых ключей. Эта инфраструктура состоит из центров сертификации открытых ключей и обеспечивает возможность своевременного подтверждения достоверности открытой информации, необходимой для проверки ЭЦП, что необходимо для предотвращения подделки подписи.

2.2 Схема Эль-Гамаля

См. [1]

Безопасность схемы основана на трудности вычисления дискретных логарифмов в конечном поле. Для генерации пары ключей выбирается простое число pgxpy=g^{x} ~(mod  p)y, g, ppgxMkp-1(r, s)

Для проверки подписи нужно убедиться, что

Первое замечание о выборе kkxkkxk

Схема Эль-Гамаля послужила образцом для построения большого семейства во многом сходных по своим свойствам схем подписи.

Пример 9.1Выберем p =11 и g = 2, а секретный ключ x = 8.

Вычислим:

Открытым ключом являются y = 3g = 2p = 11M =5k = 9GCD(9,10) = 1

Теперь находим

Итак, подпись представляет собой пару: r =6s = 3

Для проверки подписи убедимся, что:

Второе замечание. При вычислении подписи целесообразно использовать хэш-образ сообщения, а не само сообщение Mh(M)=5хеширования и шифрования с открытым ключом (в частности, RSA или Эль-Гамаля).

Алгоритм формирования подписи выглядит следующим образом:

  1. Пусть M – подписываемое сообщение. Отправитель вычисляет хеш-значение подписываемого сообщения h=h(M). Значение h должно удовлетворять неравенству 0<h<p.

  2. Отправитель выбирает случайное число k, 0<k<p-1, взаимно простое с p-1, и вычисляет числа:

    k^{-1} – число, обратное k по модулю p-1, k^{-1} существует, так как k и p-1 – взаимно просты.

  3. Подпись (r, s) добавляется к сообщению, и тройка (M, r, s) передается получателю.

Проверка подписи: получатель заново вычисляет хеш-значение присланного сообщения h(M)

Если подпись верна, то это равенство выполняется.

Отметим, что число kh(M)

Про сертификаты:  Сертификаты – купить на Ярмарке Мастеров | Ручная работа и хенд мейд

Второй учебный алгоритм хеширования

В этом алгоритме pM

  1. Начальное значение h_0 принимается равным числу десятичных разрядов в M.

  2. Для каждого десятичного знака M_i числа M вычисляется значение
  3. Значение h_n, вычисленное для последнего символа, увеличенное на 1, является хеш-значением сообщения: h(M)=h_n 1.

Вычисленное по этому алгоритму хеш-значение зависит от всех символов сообщения MПример 9.3Известны значения общих параметров системы Эль-Гамаля: p=59, g=14 и открытый ключ абонента y=20. От абонента получено сообщение M=7569, снабженное цифровой подписью Эль-Гамаля r=32, s=46. Проверить подлинность цифровой подписи. Хеш-значение сообщение вычисляется с помощью второго учебного алгоритма.

  1. Вычисляем значения y^{r} ~(mod  p) и r^{s} ~(mod  p), а затем их произведение по модулю p:

    В рассматриваемом примере получаем:

  2. Для полученного сообщения вычисляем хеш-значение h(M) по второму учебному алгоритму.
  3. Вычисляем значение g^{h} ~(mod  p).

    В примере g^{h} ~(mod  p)=14^{21}~(mod 59) = 6.

  4. Проверяем выполнение равенства y^{r}r^{s} ~(mod  p)=g^h ~(mod  p), если равенство выполняется – подпись подлинная, в противном случае – фальшивая.

    В нашем примере 53neq 6. Равенство не выполняется, значит, подпись фальшивая.

Гост р 34.11-2021 информационная технология (ит). криптографическая защита информации. функция хэширования (с поправкой) от 07 августа 2021 –

ГОСТ Р 34.11-2021

Группа П85

НАЦИОНАЛЬНЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИ

ОКС 35.040

ОКСТУ 5002

Дата введения 2021-01-01

Предисловие

Цели и принципы стандартизации в Российской Федерации установлены Федеральным законом от 27 декабря 2002 г. N 184-ФЗ “О техническом регулировании”, а правила применения национальных стандартов Российской Федерации – ГОСТ Р 1.0-2004 “Стандартизация в Российской Федерации. Основные положения”

Сведения о стандарте

1 РАЗРАБОТАН Центром защиты информации и специальной связи ФСБ России с участием Открытого акционерного общества “Информационные технологии и коммуникационные системы” (ОАО “ИнфоТеКС”)

2 ВНЕСЕН Техническим комитетом по стандартизации ТК 26 “Криптографическая защита информации”

3 УТВЕРЖДЕН И ВВЕДЕН В ДЕЙСТВИЕ Приказом Федерального агентства по техническому регулированию и метрологии от 7 августа 2021 г. N 216-ст

4 ВЗАМЕН ГОСТ Р 34.11-94

Информация об изменениях к настоящему стандарту публикуется в ежегодно издаваемом информационном указателе “Национальные стандарты”, а текст изменений и поправок – в ежемесячно издаваемых информационных указателях “Национальные стандарты”. В случае пересмотра (замены) или отмены настоящего стандарта соответствующее уведомление будет опубликовано в ежемесячно издаваемом информационном указателе “Национальные стандарты”. Соответствующая информация, уведомление и тексты размещаются также в информационной системе общего пользования – на официальном сайте Федерального агентства по техническому регулированию и метрологии в сети Интернет

ВНЕСЕНА поправка, опубликованная в ИУС N 6, 2021 год      

Поправка внесена изготовителем базы данных

Настоящий стандарт содержит описание алгоритма и процедуры вычисления хэш-функции для любой последовательности двоичных символов, которые применяются в криптографических методах защиты информации, в том числе в процессах формирования и проверки электронной цифровой подписи.

Стандарт разработан взамен ГОСТ Р 34.11-94. Необходимость разработки настоящего стандарта вызвана потребностью в создании хэш-функции, соответствующей современным требованиям к криптографической стойкости и требованиям стандарта ГОСТ Р 34.10-2021 к электронной цифровой подписи.

Настоящий стандарт терминологически и концептуально увязан с международными стандартами ИСО 2382-2 [1], ИСО/МЭК 9796 [2-3], серии ИСО/МЭК 14888 [4-7] и серии ИСО/МЭК 10118 [8-11].*

________________

* Доступ к международным и зарубежным документам, упомянутым в тексте, можно получить, обратившись в Службу поддержки пользователей. – Примечание изготовителя базы данных.

Примечание – Основная часть стандарта дополнена одним приложением:

Приложение А (справочное) Контрольные примеры.

Настоящий стандарт определяет алгоритм и процедуру вычисления хэш-функции для любой последовательности двоичных символов, которые применяются в криптографических методах обработки и защиты информации, в том числе для реализации процедур обеспечения целостности, аутентичности, электронной цифровой подписи (ЭЦП) при передаче, обработке и хранении информации в автоматизированных системах.

Определенная в настоящем стандарте функция хэширования используется при реализации систем электронной цифровой подписи на базе асимметричного криптографического алгоритма по ГОСТ Р 34.10-2021.

Стандарт рекомендуется использовать при создании, эксплуатации и модернизации систем обработки информации различного назначения.

В настоящем стандарте использованы нормативные ссылки на следующие стандарты:

ГОСТ Р 34.10-2021 Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи

Примечание – При пользовании настоящим стандартом целесообразно проверить действие ссылочных стандартов в информационной системе общего пользования – на официальном сайте Федерального агентства Российской Федерации по техническому регулированию и метрологии в сети Интернет или по ежегодно издаваемому информационному указателю “Национальные стандарты”, который опубликован по состоянию на 1 января текущего года, и по соответствующим ежемесячно издаваемым информационным указателям, опубликованным в текущем году. Если ссылочный стандарт заменен (изменен), то при пользовании настоящим стандартом следует руководствоваться заменяющим (измененным) стандартом. Если ссылочный стандарт отменен без замены, то положение, в котором дана ссылка на него, применяется в части, не затрагивающей эту ссылку.

В настоящем стандарте применены следующие термины с соответствующими определениями.

3.1.1

3.1.2

3.1.3

3.1.4

Примечание – В настоящем стандарте понятия “строка бит длиной ” и “двоичный вектор-строка размерности ” считаются тождественными.

3.1.5

3.1.6

Примечание – В настоящем стандарте в целях сохранения терминологической преемственности по отношению к действующим отечественным нормативным документам и опубликованным научно-техническим изданиям установлено, что термины “хэш-функция”, “криптографическая хэш-функция”, “функция хэширования” и “криптографическая функция хэширования” являются синонимами.

3.1.7

Примечание – В настоящем стандарте в целях сохранения терминологической преемственности по отношению к действующим отечественным нормативным документам и опубликованным научно-техническим изданиям установлено, что термины “электронная подпись”, “цифровая подпись” и “электронная цифровая подпись” являются синонимами.

В настоящем стандарте используются следующие обозначения:

*

множество всех двоичных векторов-строк конечной размерности (далее – векторы), включая пустую строку;

размерность (число компонент) вектора Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA* (если – пустая строка, то 0);

множество всех -мерных двоичных векторов, где – целое неотрицательное число; нумерация подвекторов и компонент вектора осуществляется справа налево, начиная с нуля;

операция покомпонентного сложения по модулю 2 двух двоичных векторов одинаковой размерности;

конкатенация векторов , Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA*, т.е. вектор из Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA*, т.е. вектор из Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA, в котором левый подвектор из , совпадает с вектором , а правый подвектор из совпадает с вектором ;

конкатенация экземпляров вектора ;

кольцо вычетов по модулю 2;

операция сложения в кольце ;

Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA

биективное отображение, сопоставляющее элементу кольца его двоичное представление, т.е. для любого элемента кольца , представленного вычетом Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA, где Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA, где Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA, 0, …, , выполнено равенство Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA;

Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA

отображение, обратное отображению , т.е. Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA;

Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA

отображение, ставящее в соответствие вектору Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA, , вектор Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA, , вектор Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA;

Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA

операция присваивания переменной значения ;

произведение отображений, при котором отображение действует первым;

двоичный вектор, подлежащий хэшированию, Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA*, Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA*, Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA;

Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA

функция хэширования, отображающая вектор (сообщение) в вектор (хэш-код) Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA;

инициализационный вектор функции хэширования, Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA.

Настоящий стандарт определяет две функции хэширования Magic Cookies: Как изменить алгоритм SHA1 на SHA256 в Windows CA с длинами хэш-кода 512 бит и 256 бит.

Как изменить алгоритм sha1 на sha256 в windows ca

Если результат выполнения команды

SHA256

, перейти к шагу 4.

2. По умолчанию результат выполнения команды SHA1.  Необходимо выполнить команду:

certutil -setreg cacspCNGHashAlgorithm SHA256 

Это перенастроит ваш CA на использование SHA256 для CNG хешей.

3.  Перезапустите Certificate Services: 

net stop CertSvc && net start CertSvc

4.  Перевыпишите ваш корневой сертификат:

certutil -renewCert ReuseKeys

5.  Перезапустите службу Certificate Services: 

net stop CertSvc && net start CertSvc

Эти действия сгенерируют новый корневой сертификат вашего CA с использованием SHA256 в качестве алгоритма подписи. Необходимо будет раздань новый сертификат вашим клиентам. http://technet.microsoft.com/en-us/library/cc730763(v=ws.10).aspx

Некоторые наиболее употребительные схемы эцп

В настоящее время имеется большое количество различных схем ЭЦП, обеспечивающих тот или иной уровень стойкости. Существующие схемы можно классифицировать таким образом:

Первый учебный алгоритм хеширования

Входом для данного алгоритма является строка, состоящая из букв русского языка.

  1. Выбирается число h_0 – вектор инициализации. Число h_0 равно длине сообщения в символах.

  2. Для каждого символа сообщения вычисляется значение h_i=(n_i h_{i-1})^2 ~(mod  p)$, $i=1,dots,n, где n_i – номер i-й буквы сообщения в алфавите. Для удобства вычислений ниже приведен нумерованный алфавит.

  3. Значение h_n, вычисленное для последнего символа, является хеш-значением сообщения: h(M)=h_n.

Следует отметить, что вычисленное по этому алгоритму хеш-значение зависит от всех символов сообщения Mp=79g=15xkMПример 9.2Выполнить вычисление и проверку подписи сообщения M=text{"БЛЕФ"} по алгоритму Эль-Гамаля. Использовать параметры подписи:

  1. Сформируем хэш-сумму сообщения. Начальное значение h_0 равно количеству символов сообщения: h_0=4. Далее,
  2. Вычисляем число r по формуле r=g^k ~(mod  p). Для рассматриваемого примера получили:
  3. Вычисляем число u по формуле u=(h-xr) (mod p-1), для рассматриваемого примера
  4. Вычисляем значение k^{-1} по модулю p-1 с помощью расширенного алгоритма Евклида. Для рассматриваемого примера значение k^{-1}=23.

    Примечание: если полученное значение k^{-1} – отрицательное, следует взять его по модулю p-1.

  5. Вычисляем число s по формуле s=k^{-1}u (mod p-1). В примере
  6. Цифровая подпись сообщения для рассматриваемого примера: (14,37).

Для проверки правильности вычисления полученной цифровой подписи следует произвести ее проверку с помощью открытого ключа абонента и убедиться, что подпись подлинная.

  1. Сформируем открытый ключ y абонента по формуле y=g^{x} ~(mod  p):

    Для рассматриваемого примера y=15^{34} ~(mod  79) = 38.

  2. Аналогичным образом вычисляем значения y^{r} ~(mod  p) и r^{s} ~(mod  p), а затем их произведение по модулю p.

    В примере получаем:

  3. Вычисляем значение g^{h} ~(mod  p), значение h было получено ранее.

    В примере g^{h} ~(mod  p)=15^{13} ~(mod  79)= 78.

  4. Проверяем выполнение равенства y^{r}r^{s} ~(mod  p)=g^h ~(mod  p), если равенство выполняется – подпись подлинная, то есть она была вычислена правильно.

    В примере получили 78=78, равенство выполняется, значит, подпись сгенерирована правильно.

Шаг 1 — предварительная работа

Преобразуем «Привет, мир» в двоичный код:

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111
01110010 01101100 01100100


Добавим 1:

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111
01110010 01101100 01100100 1

Дополните код нулями, пока данные не станут равны 512 бит, минус 64 бита (в результате 448 бит):

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111
01110010 01101100 01100100 10000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

Добавьте 64 бита в конец в виде целого числа с порядком байтов от старшего к младшему (big-endian), представляющего длину входного сообщения в двоичном формате. В нашем случае это 88, или «1011000».

01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111
01110010 01101100 01100100 10000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 01011000


Теперь у нас есть ввод, который будет делиться на 512 без остатка.

Шаг 2 — инициализируйте значения хэша (h)

Теперь мы создаем 8 хэш-значений. Это жестко запрограммированные константы, которые представляют собой первые 32 бита дробных частей квадратных корней из первых восьми простых чисел: 2, 3, 5, 7, 11, 13, 17, 19.

h0 := 0x6a09e667
h1 := 0xbb67ae85
h2 := 0x3c6ef372
h3 := 0xa54ff53a
h4 := 0x510e527f
h5 := 0x9b05688c
h6 := 0x1f83d9ab
h7 := 0x5be0cd19

Шаг 3 — инициализация округленных констант (k)

Как и в предыдущем шаге, мы создадим еще несколько констант. На этот раз их будет 64. Каждое значение (0—63) представляет собой первые 32 бита дробных частей кубических корней первых 64 простых чисел (2—311).

0x428a2f98 0x71374491 0xb5c0fbcf 0xe9b5dba5 0x3956c25b 0x59f111f1 0x923f82a4 0xab1c5ed5
0xd807aa98 0x12835b01 0x243185be 0x550c7dc3 0x72be5d74 0x80deb1fe 0x9bdc06a7 0xc19bf174
0xe49b69c1 0xefbe4786 0x0fc19dc6 0x240ca1cc 0x2de92c6f 0x4a7484aa 0x5cb0a9dc 0x76f988da
0x983e5152 0xa831c66d 0xb00327c8 0xbf597fc7 0xc6e00bf3 0xd5a79147 0x06ca6351 0x14292967
0x27b70a85 0x2e1b2138 0x4d2c6dfc 0x53380d13 0x650a7354 0x766a0abb 0x81c2c92e 0x92722c85
0xa2bfe8a1 0xa81a664b 0xc24b8b70 0xc76c51a3 0xd192e819 0xd6990624 0xf40e3585 0x106aa070
0x19a4c116 0x1e376c08 0x2748774c 0x34b0bcb5 0x391c0cb3 0x4ed8aa4a 0x5b9cca4f 0x682e6ff3
0x748f82ee 0x78a5636f 0x84c87814 0x8cc70208 0x90befffa 0xa4506ceb 0xbef9a3f7 0xc67178f2

Шаг 4 — цикл фрагментов

Следующие шаги будут выполняться для каждого 512-битного «фрагмента» из наших входных данных. Поскольку фаза «Привет, мир» короткая, у нас есть только один фрагмент. В каждой итерации цикла мы будем изменять хэш-значения h0-h7, что приведет нас к конечному результату.

Шаг 5 — созданием расписание сообщений (w)

Скопируйте входные данные из шага 1 в новый массив, где каждая запись представляет собой 32-битное слово:

01101000011001010110110001101100 01101111001000000111011101101111
01110010011011000110010010000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000001011000

Добавьте еще 48 слов, инициализированных нулем, чтобы у нас получился массив w [0… 63]

01101000011001010110110001101100 01101111001000000111011101101111
01110010011011000110010010000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000001011000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
...
...
00000000000000000000000000000000 00000000000000000000000000000000

Измените обнуленные индексы в конце массива, используя следующий алгоритм:


Для

i

из w[16…63]:

Теперь посмотрим, как это работает для w [16]:

w[1] rightrotate 7:
  01101111001000000111011101101111 -> 11011110110111100100000011101110
w[1] rightrotate 18:
  01101111001000000111011101101111 -> 00011101110110111101101111001000
w[1] rightshift 3:
  01101111001000000111011101101111 -> 00001101111001000000111011101101

s0 = 11011110110111100100000011101110 XOR 00011101110110111101101111001000 XOR 00001101111001000000111011101101

s0 = 11001110111000011001010111001011

w[14] rightrotate 17:
  00000000000000000000000000000000 -> 00000000000000000000000000000000
w[14] rightrotate19:
  00000000000000000000000000000000 -> 00000000000000000000000000000000
w[14] rightshift 10:
  00000000000000000000000000000000 -> 00000000000000000000000000000000

s1 = 00000000000000000000000000000000 XOR 00000000000000000000000000000000 XOR 00000000000000000000000000000000

s1 = 00000000000000000000000000000000

w[16] = w[0]   s0   w[9]   s1

w[16] = 01101000011001010110110001101100   11001110111000011001010111001011   00000000000000000000000000000000   00000000000000000000000000000000

// addition is calculated modulo 2^32

w[16] = 00110111010001110000001000110111


В расписании сообщений осталось 64 слова (w):

01101000011001010110110001101100 01101111001000000111011101101111
01110010011011000110010010000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000000000000
00000000000000000000000000000000 00000000000000000000000001011000
00110111010001110000001000110111 10000110110100001100000000110001
11010011101111010001000100001011 01111000001111110100011110000010
00101010100100000111110011101101 01001011001011110111110011001001
00110001111000011001010001011101 10001001001101100100100101100100
01111111011110100000011011011010 11000001011110011010100100111010
10111011111010001111011001010101 00001100000110101110001111100110
10110000111111100000110101111101 01011111011011100101010110010011
00000000100010011001101101010010 00000111111100011100101010010100
00111011010111111110010111010110 01101000011001010110001011100110
11001000010011100000101010011110 00000110101011111001101100100101
10010010111011110110010011010111 01100011111110010101111001011010
11100011000101100110011111010111 10000100001110111101111000010110
11101110111011001010100001011011 10100000010011111111001000100001
11111001000110001010110110111000 00010100101010001001001000011001
00010000100001000101001100011101 01100000100100111110000011001101
10000011000000110101111111101001 11010101101011100111100100111000
00111001001111110000010110101101 11111011010010110001101111101111
11101011011101011111111100101001 01101010001101101001010100110100
00100010111111001001110011011000 10101001011101000000110100101011
01100000110011110011100010000101 11000100101011001001100000111010
00010001010000101111110110101101 10110000101100000001110111011001
10011000111100001100001101101111 01110010000101111011100000011110 
10100010110101000110011110011010 00000001000011111001100101111011
11111100000101110100111100001010 11000010110000101110101100010110

Шаг 6 — сжатие

Инициализируйте переменные

a, b, c, d, e, f, g, h

и установите их равными текущим значениям хэш-функции соответственно

h0, h1, h2, h3, h4, h5, h6, h7

Запустите цикл сжатия, который изменит значения a… h. Выглядит он следующим образом:

Для i от 0 до 63

Совершим первую итерацию, сложение вычисляется по модулю 2 ^ 32:

a = 0x6a09e667 = 01101010000010011110011001100111
b = 0xbb67ae85 = 10111011011001111010111010000101
c = 0x3c6ef372 = 00111100011011101111001101110010
d = 0xa54ff53a = 10100101010011111111010100111010
e = 0x510e527f = 01010001000011100101001001111111
f = 0x9b05688c = 10011011000001010110100010001100
g = 0x1f83d9ab = 00011111100000111101100110101011
h = 0x5be0cd19 = 01011011111000001100110100011001

e rightrotate 6:
  01010001000011100101001001111111 -> 11111101010001000011100101001001
e rightrotate 11:
  01010001000011100101001001111111 -> 01001111111010100010000111001010
e rightrotate 25:
  01010001000011100101001001111111 -> 10000111001010010011111110101000
S1 = 11111101010001000011100101001001 XOR 01001111111010100010000111001010 XOR 10000111001010010011111110101000
S1 = 00110101100001110010011100101011

e and f:
    01010001000011100101001001111111
  & 10011011000001010110100010001100 =
    00010001000001000100000000001100
not e:
  01010001000011100101001001111111 -> 10101110111100011010110110000000
(not e) and g:
    10101110111100011010110110000000
  & 00011111100000111101100110101011 =
    00001110100000011000100110000000
ch = (e and f) xor ((not e) and g)
   = 00010001000001000100000000001100 xor 00001110100000011000100110000000
   = 00011111100001011100100110001100

// k[i] is the round constant
// w[i] is the batch
temp1 = h   S1   ch   k[i]   w[i]
temp1 = 01011011111000001100110100011001   00110101100001110010011100101011   00011111100001011100100110001100   1000010100010100010111110011000   01101000011001010110110001101100
temp1 = 01011011110111010101100111010100

a rightrotate 2:
  01101010000010011110011001100111 -> 11011010100000100111100110011001
a rightrotate 13:
  01101010000010011110011001100111 -> 00110011001110110101000001001111
a rightrotate 22:
  01101010000010011110011001100111 -> 00100111100110011001110110101000
S0 = 11011010100000100111100110011001 XOR 00110011001110110101000001001111 XOR 00100111100110011001110110101000
S0 = 11001110001000001011010001111110

a and b:
    01101010000010011110011001100111
  & 10111011011001111010111010000101 =
    00101010000000011010011000000101
a and c:
    01101010000010011110011001100111
  & 00111100011011101111001101110010 =
    00101000000010001110001001100010
b and c:
    10111011011001111010111010000101
  & 00111100011011101111001101110010 =
    00111000011001101010001000000000
maj = (a and b) xor (a and c) xor (b and c)
    = 00101010000000011010011000000101 xor 00101000000010001110001001100010 xor 00111000011001101010001000000000 
    = 00111010011011111110011001100111

temp2 = S0   maj
      = 11001110001000001011010001111110   00111010011011111110011001100111
      = 00001000100100001001101011100101

h = 00011111100000111101100110101011
g = 10011011000001010110100010001100
f = 01010001000011100101001001111111
e = 10100101010011111111010100111010   01011011110111010101100111010100
  = 00000001001011010100111100001110
d = 00111100011011101111001101110010
c = 10111011011001111010111010000101
b = 01101010000010011110011001100111
a = 01011011110111010101100111010100   00001000100100001001101011100101
  = 01100100011011011111010010111001

Все вычисления выполняются еще 63 раза, меняя переменные a-h. К счастью, мы не делаем это вручную. В итоге мы получили:

h0 = 6A09E667 = 01101010000010011110011001100111
h1 = BB67AE85 = 10111011011001111010111010000101
h2 = 3C6EF372 = 00111100011011101111001101110010
h3 = A54FF53A = 10100101010011111111010100111010
h4 = 510E527F = 01010001000011100101001001111111
h5 = 9B05688C = 10011011000001010110100010001100
h6 = 1F83D9AB = 00011111100000111101100110101011
h7 = 5BE0CD19 = 01011011111000001100110100011001

a = 4F434152 = 001001111010000110100000101010010
b = D7E58F83 = 011010111111001011000111110000011
c = 68BF5F65 = 001101000101111110101111101100101
d = 352DB6C0 = 000110101001011011011011011000000
e = 73769D64 = 001110011011101101001110101100100
f = DF4E1862 = 011011111010011100001100001100010
g = 71051E01 = 001110001000001010001111000000001
h = 870F00D0 = 010000111000011110000000011010000

Шаг 7 — измените окончательные значения


После цикла сжатия, во время цикла фрагментов, мы изменяем хеш-значения, добавляя к ним соответствующие переменные a-h. Как и ранее, все сложение производится по модулю 2 ^ 32:

h0 = h0   a = 10111001010011010010011110111001
h1 = h1   b = 10010011010011010011111000001000
h2 = h2   c = 10100101001011100101001011010111
h3 = h3   d = 11011010011111011010101111111010
h4 = h4   e = 11000100100001001110111111100011
h5 = h5   f = 01111010010100111000000011101110
h6 = h6   g = 10010000100010001111011110101100
h7 = h7   h = 11100010111011111100110111101001

Шаг 8 — финальный хэш

Наконец, соединяем все вместе.

digest = h0 append h1 append h2 append h3 append h4 append h5 append h6 append h7
       = B94D27B9934D3E08A52E52D7DA7DABFAC484EFE37A5380EE9088F7ACE2EFCDE9

Мы прошли каждый шаг (за исключением нескольких итераций) SHA-256 в подробностях. Если хотите увидеть весь путь, что мы совершили, в форме псевдокода, заходите на

Оцените статью
Мой сертификат
Добавить комментарий