Подскажите надежный хэш в вариантах 64 и 128 бит. MD5 проломан до неприличия, SHA1 проломан для коллизий с 80 до 63бит. Какой есть хеш на 128 чтобы достойно держал 64 бита коллизий, а также 64 чтоб держал 32бита, что для большого файла подогнать тоже непросто. Хешей много, но я не разбираюсь в них, нужна рекомендация
Пробежался по Вики, все хеши 128 бит взломаны... Для себя сделал вывод, что любой хэш проседает бит на 20-30, даже ГОСТ. Поэтому криптографические хэши начинаются от sha1 и большей длинны. Проломка на 30 бит для них некритична, поскоку они большие.
Гипотетически, можно попробовать "усечь" любой стойкий хеш, например, ГОСТ, до 128 бит. К сожалению, стойкость усеченных вариантов практически не исследуется, поэтому гарантировать что-либо в их отношении нельзя.
Тигер заточен под 64 бита, нужно будет делать двойные сдвиги, а они считаются медленными инструкциями. Ну и add adc sub sbb само собой... Хотя... Попробую для развлечения=)))
Вроде бы берут выборочно биты (где я видел спецификации на усеченные версии). Объединять несколько бит (хоть XOR-ом, хоть чем) обычно боятся, чтобы не вызвать неожиданных побочных эффектов.
hxxp://file.qip.ru/file/OLe3srOs/tiger_pas тяжело живется на свете быдлокодерам и дельфоманам =((( зарелизил на трубопаскале класс tiger, так он с MMX немного даже уступает по скорости 32-битной версии проекта RHASH. Ну дела, у меня считай псевдо-64-бита, и все-равно тормозит тому что компилер си-шный накомпилил в RHASH... Кто сможет полечить быстродействие mmx-кода милости прошу чтобы обогнать RHASH в два раза как положено =))) Пробовал вместо развертывания всех 24 раундов вызывать 3 по 8, не помогает... Благодарности принимаются в любом виде - асм, с++ и т.д. Только ESI-EDI не трогайте, пусть указывают на s-box и schedule... Да, Тигер пока не усекал, все 192 ьита
persicum Code (Text): mov al,[edx+1] movq mm0,[esi+eax*8+t4*8] mov al,[edx+3] pxor mm0,[esi+eax*8+t3*8] mov al,[edx+5] pxor mm0,[esi+eax*8+t2*8] mov al,[edx+7] pxor mm0,[esi+eax*8+t1*8] movq mm1,[ecx] paddq mm1,mm0 Это просто ужасное безобразие - модификация части регистра, а потом еще и использование в следующей инструкции. Нужно переделать это хотя бы в виде: Code (Text): mov al,[xxx+1] mov bl,[xxx+3] mov cl,[xxx+5] mov dl,[xxx+7] movq mm0,[yyy+eax*8] movq mm1,[yyy+ebx*8] pxor mm0,[yyy+ecx*8] pxor mm1,[yyy+edx*8] pxor mm0,mm1
>то просто ужасное безобразие - модификация части регистра Это я в самом дельфи подсмотрел... Хотел сначала movzx eax, byte ptr спробовать, но поскольку дельви нумерует таблицы байтами именно так, через mov al, то подумал - а зачем козе баян? Разработчикам поди виднее... Насчет al,bl,cl,dl - тоже не уверен что поможет, ведь у проца внутри куча виртуальных регистров eax, мув убивает зависимость насчет снятия зависимости четырех pxor подряд - тоже пробовал - не помогает. В общем, приаттаченный код я сильно почистил от излишних пересылок по памяти и теперь догнал RHASH вижуал-си, только странно что не перегнал в два раза, где то еще остались тормоза. Обновленный код будет вечером доступен для скачки.
А может я с ветряными мельницами воюю, может директива register long long u64 пихает переменные прямо в регистры MMX у вижуал-си?
persicum поможет. не знаю как в SSE2, а MMX даже порядок загрузки в регистры (mm0,mm1,..) влиял на быстродействие Code (Text): //pass(a,b,c,5); mov eax,[esp+3*4] mov [esp+0*4],eax mov eax,[esp+4*4] mov [esp+1*4],eax mov eax,[esp+5*4] mov [esp+2*4],eax как-то так надо... Code (Text): //pass(a,b,c,5); mov eax,[esp+3*4] mov ebx,[esp+4*4] mov ecx,[esp+5*4] mov [esp+0*4],eax mov [esp+1*4],ebx mov [esp+2*4],ecx procedure Tiger.transformSSE2 - это полная развёрнутая функция хеширования?
А почему бы не взять два разных хеша и использовать вместе например: считаем crc16 для 14 байт данных и используем 14 байт данных + 2 байта crc16 как блок для расчета md5
Почти полная. После нее нужно только выполнить a^=aa b-=bb c+=cc См.Вики Тайна быстродействия RHASH.EXE покоя не дает... пойду посмотрю под Киевом, файл не запакован слава богу... Специфические константы Тигера легко находятся.
Посмотрел RHASH.EXE под Киевом. Искал шедьюл тигера по контексту A5A5A5A5. Ничего выдающегося не обнаружил, обычный код языка высокого уровня add adc и работа с локальными переменными по отдельности со старшими и младшими двойными словами через ebp. А у меня быдлоасм SSE2 куча регистров и такой тормоз =)))
попробовал еще пошаманить применив свободные без дела регистры xmm для временного хранения вместо массива u64 x[0..7], который в оригинальном тигрином коде записан как регистровые переменные x0..x7. Это дало еще процентов 15% прироста, а код превратился в сплошной отстой вида movq2dq movdq2q. Смысла модифицировать дальше своими силами нет. Буду ждать пока матерый спец сварганит себе c++ класс тигер на MMX+PADDQ и любезно выложит. Нужно непременно перегнать нативный вижул-си в два раза на асме+MMX, а то в чем тогда польза от асма у которого ума как у перфокарты? Кста вижул си в RHASH.EXE сделал pass действительно как movzx eax,[] movzx ebx,[] movzx ecx,[] movzx edx,[] вместо дельфовово xor eax,eax mov al,[] как тут советовали, но я не верю что это сильно поможет ктомуж регисты заняты под указатели на наши a b c.
Да, вот еще, отеческие криптоманы криво откомпилили демо-код и насчитали лажу а не тест векторы. кому не лень поправьте Вику.