xkcd: внешние эффекты
Итак, в веб-комиксе xkcd Externalities от 1 апреля 2013 года говорится о конкурсе Skein 1024 1024. Я предполагаю, что это должно быть не более чем попытка грубой силы, когда случайные строки хэшируются, чтобы соответствовать опубликованному хэшу Рэндалла? Это правильно?
Кроме того, мои знания по теории хеширования Skein практически отсутствуют, но, будучи наполовину приличным программистом, я смог загрузить и запустить как SkeinFish (C#), так и Maarten Bodewes Skein (Java) в режиме 1024 1024 с некоторыми входными строками. Однако хеши, которые они давали, отличались от хешей, которые xkcd возвратил для того же ввода. Это может быть чрезвычайно наивный вопрос, но дают ли разные реализации Skein разные хеши? А какую реализацию Skein использует xkcd?
Спасибо за прощение моего невежества!
3 ответа
Существует несколько разных итераций алгоритма скейка. XKCD использует версию 1.3, которая также является самой последней. Источники можно найти здесь (ищите "V1.3")
Интересно, что этот метод грубой силы тот же самый, который Биткойн использовал для "майнинга" биткойнов. Большим отличием является алгоритм хеширования (в данном случае SHA-256) и целевой хеш (который динамически определяется как любой хеш, начинающийся с определенного числа нулей.) Требуется много работы, чтобы обнаружить хеш, но один раз было обнаружено, что тривиально проверить исходные биты, и что полученный хэш соответствует критериям.
Вот исходный код, используемый командой Стэнфорда. Некоторое время мы запускали это примерно на сотне 8-ядерных серверов EC2, но не в целом.
Если вы хэшировали не алфавитно-цифровые символы (пробелы, знаки препинания и т. Д.), Возможно, вы получили разные результаты из-за кодировки HTML-формы. Атрибут "enctype" в форме, которую размещал XKCD, был "application/octet-stream", который, согласно https://developer.mozilla.org/en-US/docs/HTML/Element/form, не поддерживается браузером стандарт. Я предполагаю, что браузер возвращается к типу кодировки URL, когда видит тот, который не распознает.
Я заметил, что строка "=" отправляется в кодировке URL в Chrome и возвращает хеш, отличный от того, что я получил локально с последним pyskein. Но когда я отправил его с помощью этой командной строки curl (больше не работает), я получил ожидаемый хеш:
curl -X POST --data-binary "hashable==" "http://almamater.xkcd.com/?edu=school.edu"
Код Стэнфорда в другом ответе делает то же самое, и они, очевидно, имели некоторый успех. Я никогда не получал случайных данных для локального хэширования с лучшим результатом, чем даже в моей собственной школе, поэтому у меня никогда не было возможности тщательно проверить, как правильно передавать произвольные данные. Я не знаю, каково было точное поведение (например, возможно, если вы не указали hashable= сервер обнаружит это и просто хеширует все тело POST), но это могло быть преднамеренно немного сложнее, чем часть April Fool.