Простой вопрос о скорости работы SHA1 и MD5
Прошу простить мое невежество, вопрос, наверное, не только простой, но даже наивный, но не могу ниггже найти ответа в каких-то ясных, доступных для сравнения цифрах, например так: хэширование методом SHA1 в оптимальной реализации расходует 100 (или сколько там) машинных команд на один байт текста. Либо так: хэширование этим методом производится со скоростью 1 Мб (или сколько там) в секунду на машине AMD Sempron с тактовой частотой 2,3 ГГц. Просто и хорошо!
Но как раз таких понятных цифр я найти не могу, везде только описание алгоритма, а сам получить эти цифры не умею, разве что написать своими руками ассемблерную реализацию этих хэшей на ассемблере, сосчитать операторы… Если кто-то избавит меня от этой нудной работы, подскажет цифру, буду признателен.
Придется признаться, что я с детства отличался болезненной склонностью к теоретизированию, потому и философская подготовка у меня обширнее математической, так что я долго ломал себе голову над тем, что это такое — случайность. Ужасной глубины вопрос, не чета мне люди на нем зубы сломали...
Так вот, даже та случайность, которая полная, все же бывает очень разного сорта — есть независимые случайные события, а есть зависимые. Те и другие случайные, но качество случайности разное, при бросании монетки уже наступившие события не влияют на вероятность последующих, а при сдаче карт из колоды влияют — вероятность того, что следующая карта будет пиковой дамой, растет строго монотонно: 1/17, 1/16, 1/15, 1/14...
Это все из учебника, а углубленный анализ показывает более тонкие различия — сдача карт из колоды и выход шаров из тиражного барабана вроде бы совершенно тождественные процессы, то и другое цепочка зависимых случайных событий, настоящая случайная выборка без возврата, — ан нет, различие есть, чтобы его уловить, приходится ввести понятие отложенной случайности, так и пишем: наступившее событие, но неизвестное, мы считаем актуально ненаступившим! И соответственно вычисляем вероятность его наступления.
Вот оно — мы не знаем, орлом или решкой легла монета, потому что она закатилась под диван, так что для нас это наступившее событие находится в будущем. С колодой карт то же самое — настоящим случайным процессом является не сдача колоды (прометка), а тасование, а сдать карты можно только в том порядке, в каком они лежат в колоде (если не дергать!), так что прометка не случайный процесс, а только раскрытие (развертывание) случайного объекта (комбинаторного) — случайной перестановки 36 карт... Да, и этим сдача карт принципиально отличается от выхода шаров из тиражного барабана лотереи: там тоже любой номер может последовать за любым, но это случайность актуальная, информация о наступлении событий не отстает от событий ни на шаг...
Так вот, к чему вся эта теория? Это к тому, что случайность бывает разная, такая и этакая. Есть случайные объекты, а есть случайные процессы. Хорошая гамма, зависящая от пароля и от nonce, есть в точном смысле случайный объект — в точнейшем смысле, самом строгом, по учебнику: это случайная функция, то есть функция от случайного аргумента. Поэтому даже приставка псевдо- применительно к такой случайности выглядит лишней, это настоящая случайность. Но это не процесс, а объект — уже готовый, вроде стасованной колоды. Зато асинхронный шифр по своей природе не объект, а процесс — у него есть траектория, после замены во входном тексте хотя бы одной точки на запятую шифртекст меняет траекторию, все символы будут другими. Тоже случайность, но другая.
Да, да, и вот это же самое касается хэша, у которого левая и правая половина строки изменяются по разному закону! Обе половины полностью случайны, это строгое утверждение, но при малых искажениях текста левая и правая половины изменяются с неравной вероятностью. Одно другому не противоречит — не все случайные события равновероятны, не все распределения случайных величин равномерны...
Вот относительно гаммы есть это требование — равномерность, равновероятность, есть еще более тонкие условия Голомба. А относительно хэша... ну, не хочется спорить с людьми, которые в текущем положении вопроса осведомлены лучше меня, но все же должен заметить, что если общепринятое требование состоит в том, чтобы все символы хэша были равновероятны — не просто случайны, а именно равновероятны! — это требование несуразное, оно сформулировано с грубой ошибкой. Более точное и резонное условие — чтобы все символы хэша с равной (и очень высокой) вероятностью изменялись при малейших изменениях в тексте, это как раз в просторечии и называют лавинным эффектом, но и в такой формулировке есть теоретический изъян — это требование легко выполнить жульническим образом, схитрить. Очень просто: сделать так, что символы хэша зависят не только от символов текста, но и друг от друга. Истинная разрешающая способность хэша состоит в том, что на одну ошибку в тексте он отзывается ошибками в 21 байте из 32, а мы делаем перемешивание, складываем левую и правую часть — и пожалуйста, 32 ошибки на 32 байта. Только это жульничество и шарлатанство, формально условие соблюдено, но пользы никакой.
А от слабой половины хэша есть польза, причем реальная, даже двоякая: во-первых, для длинного хэша трудно найти коллизию, во-вторых, у нас появляется тонкий признак — по числу ошибок хэша я могу хотя бы приблизительно сказать, что в этом тексте ошибки пошли потоком, а в этом есть только единичные ошибки — одна, две, три, более трех, но менее двенадцати...
Но уж если кому-то сильно не нравится функциональная неоднородность хэша (неравноценость разрядов, несовпадение физической и эффективной длины), тогда другой путь, тяжелый: слабую часть отбрасываем, а сильную удваиваем, доводим до 32 байт, — только вычислительные затраты будут уже не 120 команд на букву текста, а 220 команд.
Это много или мало? Стоит ли овчинка выделки?
комментариев: 9796 документов: 488 редакций: 5664
Вопрос об истинной случайности? Этот вопрос по-настоящему не решён никак, о чём есть оговорки в работах по криптографии. К нему подходят чисто с утилитарной точки зрения. Обычно требуется создать равномерное случайное распределение и вводится понятие противника, который не сможет воспроизвести результат, не потратив определённого количества вычислительных затрат на восстановление внутреннего состояния.
Необходимое, но недостаточное, скажем так.
Нахождение любого различителя, быстрее чем полный перебор, между хэшем и случайной функцией — взлом хэша. Хэш должен быть неотличим от т.н. "модели случайного оракула" (Random Oracle Model). Все требования к хэшу по (псевдо)случайности (равномерность распределения, неразличимость подмножеств выхода, лавинный эффект, невозможность найти связь между входом и выходом, нахождение первых и вторых прообразов) должны укладываться в ROM.
Можете посмотреть, как вопрос неразличимости в ROM решён для функции KeccaK.
Хэш — это не просто контрольная сумма. Противник не должен уметь угадывать текст по хэшу, не должен уметь угадывать насколько сильно поменялся текст по изменениям хэша. Если это требование несоблюдено, противник может строить атаки на криптографические протоколы.
Что касается просто контрольной суммы без требования случайности (а только различимости на разных текстах), наверное, криптографы долго думали и пришли к выводу, что это не реализуемо без случайности — просто потому, что длина этой контрольной суммы сильно ограничена по сравнению с длиной текста, от которого она берётся. Имеет ли смысл такой узкоспециальный вопрос, как контрольная сумма (не хэш!) от текстов длиной порядка самой контрольной суммы? Не могу сказать. Наверное, такую задачу можно свести с каким-то случайным перестановкам. Напомнило/comment52716.
комментариев: 43 документов: 0 редакций: 7
чтобы рассматривать что такое случайность надо сперва определить о какой случайности идёт речь. Хеш md5(x) не случаен для одного и того же x. Правильнее сказать про хеш так:
Существует hash=md5(x), но не существует функции x=de_md5(hash) с приемлимой вычислительной сложностью.
Далее – под случайным событием иногда понимают не то, что им является. Например я подкидываю монету. Какова вероятность, что монета лежит орлом вверх? Сейчас она равна 100%, это свершившийся факт, просто никто пока не знает о нём. А вот вероятность, что Вы угадаете как лежит монета будет в идеале равна 50% в случае если нет никакой обратной связи между Вами и монетой. По сути в большинстве случаев под случайным событием имеется в виду такое событие, о котором не было известно, что оно произойдёт. В случае с квантовыми процессами из-за принципа неопределённости получается, что ещё и нельзя получить точную информацию, т.е. по сути из-за физических ограничений нельзя предугадать процесс и он становится в чистом виде случаен. Бритва Окамма удаляет вопрос о том будут ли две системы с полностью одинаковыми исходными данными развиваться одинаково, так как это никак нельзя проверить, т.е. нельзя создать или даже просто пронаблюдать две абсолютно одинаковые системы.
Самым уязвимым для критики местом оказалось, что у хэша есть неоднородность, левая и правая часть строки по-разному отзываются на ошибки в тексте, ну, и за этим вопиющим безобразием как-то незамеченным осталось сообщение, что это только один хэш из двух, а есть второй с другими свойствами, его выходная строка размещение без повторений. Так это просто кусочек более длинной строки, случайной перестановки всех 256 байт, можно вычислять ее полностью, а 24, 32 или 64 байта из 256 берутся просто ради экономии, это сокращает вычисления.
Но как раз у этого алгоритма теория жуткая! Конечно, случайных перестановок не 256, а 256! (примерно 10+e507), но это очень, очень проблемная штука — доказать, что хэширующая функция может порождать любую перестановку из всего множества возможных. Дикая задача! На самом деле она даже не сводится к вопросу, может ли подгруппа от данного набора образующих покрывать всю группу, как раз на этот счет есть известные результаты, почти классические, считается, что два произвольно выбранных элемента (случайных, случайных!) почти наверняка порождают группу целиком, — но это результат, как говорится, без ограничения общности, предполагается, что множители берутся в любом количестве и во всех степенях. А в реальной программе это невозможное условие, никто не может брать множители в ЛЮБОМ количестве, как раз количество ограничено, и тогда для всякого частного случая доказательство того, что среди произведений есть все 256! различных перестановок, становится невыразимо трудным. И от автора не приходится ждать помощи, хотя есть сведения, что он жив, просто по житейским причинам переменил интересы, сейчас работает крановщиком в городе Ашдоде. Или в Ашкелоне, точно никто не знает...
Да, так этот хэш, где случайные перестановки, он с виду красивее, элегантнее, и на порчу одного бита текста отзывается сразу вся строка — все 24 байта из 24 или 32 из 32, но радости в этом мало, потому что нет средства точно оценить вероятность коллизии, когда вся строка случайно совпадет с правильным значение. Очень поганая теория! Хотя в реализации есть какие-то бешеные хитрости, чтобы этот изъян в теории обойти. Ну, усложнения, которые не устраняют трудность, а переносят ее в другое место — нельзя доказать, что все произведения будут различны, так докажем хотя бы, что все множители будут различны: хэширование романа "Война и мир", который содержит три миллиона букв, состоит в том, что перемножаются три миллиона перестановок — и все разные, все различные! Но опять же не доказано, что различающиеся наборы множителей дают различные произведения, наоборот, легко доказывается, что произведения будут совпадать, коллизий сколько угодно, потому различных произведений всего-навсего 256!, а различных наборов множителей длиной в "Войну и мир" гораздо больше, — и не доказано даже более слабое утверждение, что вероятность коллизии будет немногим больше 1/256! Вот в чем загвоздка...
Поэтому красота этого алгоритма меня уже не радует, безумные хитрости реализации тоже не радуют (они еще и дорогостоящие, расходы на вычисления быстро растут), а вот тот алгоритм, где у хэша есть сильная и слабая половина, радует гораздо больше. Теория простая и понятная! Ну, раздражает людей слабая половина строки, откинем ее к черту, но даже и у этой слабой половины теория яснейшая, оценки вероятности элементарнейшие, все выражается аликвотными дробями, уровень математики древнеегипетский и вавилонский...
комментариев: 9796 документов: 488 редакций: 5664
Кстати, с практической точки зрения, важен ещё объём памяти в процессе исполнения алгоритма, не только скорость. Безотносительно к объёмам памяти современных компьютеров, он всё равно должен быть минимальным для универсальности. RC4 — один из самых быстрых, но во многих случаях (микроконтроллеры, смарт-карты) неприемлимый по объёмам памяти.
Вспомнил старинный анекдот. "-- Это такси! — Такси. — А где шашечки? — Так вам нужны шашечки или нужно ехать?"
Вот и у нас то же самое. Что важнее — чтобы по хэшу было трудно найти прообраз (истинный или коллизионный) или чтобы хэш был по свойствам неотличим от этой самой Модели Случайного Оракула? Люблю теорию, но думаю, что первое важнее. А если кто-то скажет, что все, все без исключения условия в этой модели обязательны и рациональны, не поверю. Вам ехать или вам шашечки? Теория штука общая, а теперь объясните мне частный случай, в цифрах — в строке хэша ровно 16 байтов из 32 в ответ на порчу одного бита текста изменяются с вероятностью ровно 5/16 — вот и скажите,
в каком году умерла бабушка швейцараво сколько раз это облегчает подыскание прообраза.Сам сосчитать не могу, но предполагаю, что уменьшение расходов незначительное.
Посмотрю, спасибо. Вот только пойму ли — это вопрос...
комментариев: 9796 документов: 488 редакций: 5664
Без разницы. В криптографии нельзя понять заранее "поедет такси или нет". Может оно едет, но нас обманывают? Пока кто-то не раскроет нам глаза, показав взлом. При создании алгоритма можно только надеяться, что правильно нарисовали весь чертёж, включая шашечки и тогда оно будет ездить как надо в рамках нашей модели, вдобавок ещё и ограниченной и несовершенной.
Поэтому без теории совсем никак. Например, это — атака. И это, т.е. это тоже. Если они будут быстрее брутфорса — то это сертификационный взлом и снятие алгоритмов с конкурса даже при отсутствии практических применимостей.
Если что, у нас есть FAQ по общим вопросам криптографии и статьи по доказуемой безопасности.
Угадал чужой секрет — схватил и бежать. И у них всегда так было, еще папаша Гека Финна говорил так: "Когда тебе подвернется курица, хватай ее, даже если она тебе не нужна, потому что кому-то другому она пригодится, а доброе дело никогда не пропадет." Оцените логику этого утверждения! И его мораль тоже...
Вот и законодательство такое же, в законе прямо просвечивает эта идейка, что чужая курица создана специально для твоего счастья. Сумел украсть — хорошо, а не сумел, жадный собственник спрятал ее под замок — не огорчайся, права этого скупердяя закон ограничивает сроками, подожди немножко, и курица будет твоя...
Да, именно так и выходит — я построил дом, он мой безусловно, целиком и навсегда, и от меня перейдет детям и внукам, а если я написал роман, у детей и внуков права на гонорар кончаются через 50 лет после моей смерти, а если я изобрел зубной порошок с низкой абразивностью, то меня лишат прав на это изобретение еще при жизни, лет через 17...
Это ради прогресса? Нет, тут другая идея, вообще социалистическая — люди с трудом признали, что мои штаны принадлежат только мне, но все же не могут смириться с мыслью, что бумаги в моем столе тоже принадлежат только мне. Нет, искусство принадлежит народу! И новая техника является народным достоянием...
Ладно, это ихняя буржуйская мораль, загнивающий Запад, известное дело, еще в школе проходили, но кто же их все-таки кормит при таких порядках? Как они при таких жлобских законах с голоду не перемерли?
Уму непостижимо...
комментариев: 9796 документов: 488 редакций: 5664
комментариев: 9796 документов: 488 редакций: 5664