@keqyCpp

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

Я изучаю реализацию алгоритма sha-1 на с++. Для добавления единичного бита используется 0x80. Почему если надо добавить единицу, добавляется 128?
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);                                                      //Заполняем сообщение нулями
}


Вот что написано на википедии:
Исходное сообщение разбивается на блоки по 512 бит в каждом. Последний блок дополняется до длины, кратной 512 бит. Сначала добавляется 1 (бит), а потом — нули, чтобы длина блока стала равной 512 — 64 = 448 бит.
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
Daemon23RUS
@Daemon23RUS
(unsigned char) это аж целых 8 !!! бит а 0x80 в битовом представлении = 10000000
Т.е 1 еденичка и все нули.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Мы обычно привыкли к порядку байтов в слове. Однако в криптографии и телекоммуникациях также играет роль порядок битов в байте — обычно у младшего бита номер 0, а у старшего 7. Это упрощает произвольный доступ к любому биту, передачу информации в порт по одному биту — я писал самодельные низкоуровневые коммуникационные протоколы, правда, давно и под DOS. Но тут, по-видимому, наоборот — байт начинается со СТАРШЕГО бита. Вижу в этом две причины.
1. Межплатформенный стандарт двоичной передачи данных — передавать длинные числа, начиная со старшего байта, просто для удобства ручного исследования протоколов. Тут ручное исследование доведено до предела: байт делится на биты, которые также записываются от старшего к младшему — как мы бы записывали на бумаге.
2. Криптографию по-чёрному оптимизируют, чтобы она оперировала не байтами, а самыми длинными единицами, доступными процессору: 64-битный — значит, блоками по 8 байтов.

0x80 = 0b1000'0000. Вот вам и единичный бит и куча нулей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы