мой код для алгоритма sha256 на python не содержит ничего, кроме длины более 56 символов (448 бит).

#python #algorithm #security #hash #sha256

Вопрос:

Насколько я понимаю, проблема возникает, когда я заполняю сообщение нулями до тех пор, пока оно не станет кратным 512. Если заполнение приводит к заполненному сообщению длиной 512, оно работает, но если сообщение в битах gt;= 448, длина дополненного сообщения = 1024, и оно не работает.

Я не знаю, как использовать каждый фрагмент данных для списка слов или для части сжатия.

  • Кто-нибудь знает, как обрабатывается каждый блок (64 байта)?
  • Нужно ли мне создавать другой список слов для каждых 512 бит?

Я пытался использовать тестовые векторы, но они были совершенно бесполезны.

Я хеширую ba7816bf8f01cfea414140de5dae2223bda12ae1a5324sfdserew3ra , используя алгоритм sha256.

Правильное значение хэша: 1caa150674ab1aed030dc69f9b86dbcbc412e6e1dd20344eeaa21687acae7789

Мой результат: efcf3579753ef16f9f515f61d901eaafa03aafa6b9e092fe3d087efdfd25c41e

Мое определение заполнения списка слов:

 self.convertToBytes = "".join(format(ord(char), "08b") for char in msg)  padding = (512 - len(self.add1) - 64) % 512  self.zFill = self.add1   "".zfill(padding)  # add ascii value of length of msg's to zFill # the length of self.addlen is always a multiple of 512 self.addlen = self.zFill   format(len(self.convertToBytes), "08b").zfill(64)[0:64] addtoW = [  self.addlen[i : i   32] # seperated each 32 bits into a list; Each entry = 32 bits.  for i in range(0, len(self.addlen), 32) ]  # length of self.W is always 64 no matter the length of message # if len(addtoW) lt; 64: self.W = addtoW   [  "".zfill((64 - len(addtoW)) * 32)[i : i   32] for i in range(0, 64 - len(addtoW)) ]  

Комментарии:

1. При реализации любого криптографического алгоритма (будь то хэш или шифр) вы должны думать не о «значениях ascii», а о байтах…

2. AKX, это первый алгоритм хеширования, который я закодировал, и тестовые векторы, которые я использовал, имели значения ASCII, поэтому для сравнения я также использовал значения ASCII.