MD5 / SHA "обновить" свойство? - PullRequest
0 голосов
/ 30 ноября 2010

Что такое свойство MD5 / SHA, которое позволяет вам «обновлять» их?Например, если у вас есть хеш для «теста», вы можете добавить «case», чтобы получить хеш для «теста».Я хотел бы немного прочитать об этом свойстве, но мои поиски ничего не дают ...

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

Это просто то, что они фактически вычисляются постепенно - вы вычисляете их, работая с первыми n байтами данных, (128 в случае MD5, см. http://en.wikipedia.org/wiki/MD5#Algorithm),, затем с последующими n байтами данныхи т. д.

1 голос
/ 01 февраля 2012

Алгоритм MD5 имеет следующие шаги:

1) pad input string to a multiple of 64 bytes
2) split input string into blocks of 64 bytes
3) initialise state (a 4-element array)
4) for each block: state <= transform(state,block)
5) encode state as string

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

Инициализация:

1) initialise state
2) leftover bytes <= ""

Обновление:

1) append leftover bytes to start of input string
2) split input string into blocks of 64 bytes
3) for each complete block: state <= transform(state,block)
4) leftover bytes <= contents of the incomplete block, if one exists

Дайджест:

1) pad a copy of the leftover bytes
2) split the padded leftover bytes into blocks of 64 bytes
2) tmp_state <= state
2) for each block: tmp_state <= transform(tmp_state,block)
3) encode tmp_state as string

Я фактически реализовал этот подход в VBA - кажется, он работает нормально.Любые предложения, где я должен загрузить код?

1 голос
/ 30 ноября 2010

РЕДАКТИРОВАТЬ: Это даже теоретически невозможно из-за 1-битного заполнения, которое я упоминаю ниже.В действительности, md5("case", seed=md5("test")) == md5("test" + <1-bit> + "case").Невозможно использовать md5("test") для поэтапного вычисления md5("test" + "case").

Это теоретически возможно, если вы объединяете 512-битные порции.Это не будет работать для добавления "case" к "test", потому что первый запуск конечного автомата загрязнен заполнением, используемым для преобразования "case" в 512-битный блок.

Кроме того, заполнение - это не просто набор нулей.Сообщение всегда сначала дополняется 1 битом, поэтому «case» и «case \ 0» создают разные хэши.Таким образом, вы не можете полагаться на «case», имеющий одинаковый хеш с заполнением или без него.

...