Почему для добавления одного бита используется значение 0x80?

Я изучаю реализацию алгоритма SHA-1 на C++. Для добавления единичного бита в сообщение используется значение 0x80. Не могу понять, почему для этого добавляется 128 — разве это не больше одного бита? <br/><pre><code class="cpp">void SHA_1::extension() // Шаг 1 - Расширение сообщения
{
    bitlen = message.size() * 8; // Исходная длина сообщения в битах (нужна для шага 2)
    message.push_back((unsigned char)0x80); // Добавляем в конец сообщения единичный бит

    while ((message.size() * 8) % 512 != 448) // Пока длина сообщения не станет равной 448 по модулю 512,
        message.push_back(0); // Заполняем сообщение нулями
}</code></pre><br/><br/> Вот что написано на википедии: <br/> Исходное сообщение разбивается на блоки по 512 бит. Последний блок дополняется до длины, кратной 512 бит. Сначала добавляется 1 (бит), а затем — нули, чтобы длина блока стала равной 512 — 64 = 448 бит.
  • 17 ноября 2024 г. 20:33
Ответы на вопрос 2
Когда в программе SHA-1 вы добавляете значение 0x80 (в шестнадцатеричном представлении это 10000000 в двоичном), это на самом деле соответствует добавлению "единичного бита", но не в том смысле, что вы добавляете только один бит. Вместо этого 0x80 представляет 8 бит в форме одного байта, где старший бит равен 1, а все остальные биты равны 0.

Вот как происходит процесс добавления единичного бита и заполнения нулями:

1. **Добавление "1"**:
   - В SHA-1 вы добавляете бит "1" в конец сообщения. Поскольку данные обрабатываются побайтово (в виде байтов), то для добавления этого единственного бита "1" вы добавляете байт с битовой маской 0x80. Это добавляет "1" в старшие 8 бит, что удобно для обработки данных.

2. **Дополнение нулями**:
   - После добавления первого бита "1" (в виде 0x80) вы продолжаете добавлять нули, пока общее количество бит не станет равным 448 по модулю 512. То есть вы добавляете байты с нулями (0x00) до тех пор, пока общая длина сообщения не станет кратной 512 минус 64 бита, что позволяет добавить длину оригинального сообщения (64 бита) в конце.

Таким образом, 0x80 фактически добавляет первый бит "1", и далее, с помощью добавления нулей, вы подготавливаете сообщение к дальнейшему шагу, где будет добавлена длина оригинального сообщения.

Для ясности:
- Добавление 0x80 = добавление одного единичного бита + 7 нулей (вот что имеется в виду под "добавление одного бита"). 
- Затем производится дополнение нулями (0x00), чтобы достичь нужной длины сообщения.

В результате соблюдается требование, что общее сообщение имеет длину, кратную 512 бит, с необходимым количеством битов, которые будут включены в финальный процесс хеширования.
(unsigned char)0x80 это аж целых 8 !!! бит а 0x80 в битовом представлении = 10000000 
Т.е 1 еденичка и все нули.
Похожие вопросы