Рейтинг:2

Каковы первые биты битовой строки, например, сгенерированной с использованием SHA-256?

флаг ve

У меня есть строка, которая генерируется из SHA-256.

х = fea5f97f9ca1e1a0a2ae344f4e12a3ab0c4d9221e6bb5d70bc567e39f8fbc3d5

Какие первые 10 бит имеют значение Икс?

флаг et
Вывод кажется шестнадцатеричным. Каждый символ здесь хранится в 4 битах. Вам нужно 2 и 1/2 символа, чтобы получить 10 бит
Рейтинг:2
флаг ng

Название вопроса (сейчас) спрашивает: «Каковы первые биты битовой строки». Это однозначно, если биты представлены индивидуально в хронологическом порядке или в письменном виде в контексте, где существует обычный порядок чтения, например, слева направо.

Но основная часть вопроса касается «строки, сгенерированной из sha256». Это следует читать как SHA-256, определяемый ФИПС 180-4. Это алгоритм, который выводит «битовую строку» $256$ биты, и они не сразу идентифицируются.

В теле вопроса есть х = с последующим $64$ все символы либо цифры, либо буквы из а к ф (в униформе, здесь строчные), что $16=2^4$ символы. Это намекает на то, что результат SHA-256 закодирован в шестнадцатеричный, с кодировкой каждого символа 4 бита (обратите внимание 256$=64\times4$). Это одно из нескольких распространенных представлений битовых строк в виде символов.

Существует несколько разных и несовместимых способов преобразования шестнадцатеричных чисел в биты, но, к счастью, в случае SHA-256 один указан в 3.1 подпункте 2 на страница с пометкой 7 FIPS 180-4 (обязательно к прочтению). Таким образом, самые значащие биты идут первыми, будь то полубайт (4 бита), байт (8 бит) или слово (32 бита в случае SHA-256).

Таким образом, чтобы найти первый $я$ битов для заданного хэша SHA-256, мы можем

  • Проверь это $0\le i\le256$, в противном случае запрашиваемое значение не определено.
  • Возьмите первый $\lceil i/4\rceil$ символы (где $\lceilr\rceil$ с $r\in\mathbb R$ является наименьшим целым числом по крайней мере $г$); здесь $я=10$, таким образом $\lceil i/4\rceil=3$, поэтому берем феа
  • Запишите каждый из этих символов (в порядке чтения) в виде 4 двоичных цифр в соответствии с соглашением о порядке байтов, за
    0 -> 0000 4 -> 0100 8 -> 1000 с -> 1100
    1 -> 0001 5 -> 0101 9 -> 1001 г -> 1101
    2 -> 0010 6 -> 0110 а -> 1010 д -> 1110
    3 -> 0011 7 -> 0111 б -> 1011 е -> 1111
    
  • В результате получается строка $4\,\lceil i/4\rceil$ бит (здесь 12 бит 111111101010), из которых мы оставляем первый $я$ биты (здесь 1111111010).

Это относится ко всем хэшам семейства SHA (замена $256$ с их выходной шириной). При отсутствии другой спецификации разумно применять ее к другим стандартным хэшам, ширина вывода которых кратна $32$ (или даже $8$ или же $4$) биты. Это спорно для MD5, так как он использует мало-порядок байтов соглашение о порядке байтов в $32$-битное слово.И я бы не стал слепо распространять его на другие величины, используемые в криптографии и также представленные в шестнадцатеричном формате, такие как целые числа, используемые в RSA.

Рейтинг:0
флаг in

Поскольку это относится к программированию и должно быть закрыто или перенесено, здесь, в Python, с обратным порядком байтов;

определение LSBBits(hexData, lsbs):

    масштаб = 16 ## равно шестнадцатеричному

    inBinary = bin(int(my_hexdata, масштаб))[2:]
    inBinary = inBinary.zfill(256)
    вернуть inBinary[len(inBinary)-lsbs:]

def MSBBits(hexData, mbsb):

    масштаб = 16 ## равно шестнадцатеричному

    inBinary = bin(int(my_hexdata, масштаб))[2:]
    inBinary = inBinary.zfill(256)
    вернуть inBinary[:mbsb]

my_hexdata = "fea5f97f9ca1e1a0a2ae344f4e12a3ab0c4d9221e6bb5d70bc567e39f8fbc3d5"


печать (LSBBits (my_hexdata, 10))
печать (MSBBits (my_hexdata, 10))

И программа выдает.

1111010101
1111111010

Большой и маленький порядок следования байтов это другая история. NIST предполагает обратный порядок байтов.

fgrieu avatar
флаг ng
Боюсь, этот ответ не по теме вопроса.
kelalaka avatar
флаг in
@fgrieu Я ожидал миграции...Да, из-за артефакта вызывал zfill, убрал, спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.