eXeL@B —› Основной форум —› Как обратить хэш функцию? |
Посл.ответ | Сообщение |
|
Создано: 24 октября 2011 12:46 · Личное сообщение · #1 |
|
Создано: 24 октября 2011 13:24 · Личное сообщение · #2 |
|
Создано: 24 октября 2011 13:57 · Личное сообщение · #3 |
|
Создано: 24 октября 2011 14:18 · Личное сообщение · #4 Если операция h = h + (h << 1) + (h << 4) + (h << 5) + (h << 7) + (h << 8) + (h << 40); обратима, то хэш можно вскрыть атакой Проанализируем операцию на обратимость. Сначала заменяем сдвиги умножениями: h = h + (h * 2) + (h * 16) + (h * 32) + (h * 128) + (h * 256) + (h * 1099511627776). Упрощаем: h = h * 1099511628211 Так как умножение по модулю, математически это можно записать как 1099511628211x=b(mod 18446744073709551616). Это линейное сравнение, или сравнение первого порядка вида ax = b (mod m). Если a и m взаимно простые, т.е. их НОД равен 1, то линейное сравнение имеет одно решение, т.е. обратимо, иначе оно имеет НОД(a, m) решений. НОД(1099511628211, 18446744073709551616) = 1. Дальше рассказывать или сам выкуришь матчасть? ----- PGP key | Сообщение посчитали полезным: zeppe1in, Veliant |
|
Создано: 24 октября 2011 14:26 · Поправил: PE_Kill · Личное сообщение · #5 |
|
Создано: 24 октября 2011 14:27 · Личное сообщение · #6 |
|
Создано: 24 октября 2011 14:59 · Личное сообщение · #7 vasyaC пишет: Рассказывайте дальше, я внимательно слушаю Ок, рассказываю дальше. Если ax=b(mod m) при gcd(a, m) = 1, то x = (by mod m), где ay = 1 (mod m). Подставляем числа в последнее уравнение: 1099511628211y = 1 (mod 18446744073709551616) и решаем его через Следовательно обращением умножения на 1099511628211 будет умножение на 14886173955864302971 (по модулю 2^64). ----- PGP key | Сообщение посчитали полезным: PE_Kill, Isaev |
|
Создано: 24 октября 2011 15:07 · Личное сообщение · #8 Дальше мы можем сделать атаку встречи посередине. Просчитываем половину хеша для первых 4х байт и сохраняем в памяти, просчитываем обратный хеш с конца для последних 4х байт и ищем совпадения. Понадобится 2 * 2^32 операций вычисления половинки хеша и 2^32 памяти для хранения отсортированных пар хеш-значение. Каждая такая пара весит 8+4=12 байт, значит нужно 48 гигабайт памяти. Если нет 48 гигов, можно сделать встречу не совсем посередине. Например просчитываем таблицу для первых трех байт (8+3 * 2^24 = 176mb) и брутим обратный хеш для 5 последних байт (2^40 операций). ----- PGP key | Сообщение посчитали полезным: vasyaC |
|
Создано: 25 октября 2011 11:28 · Личное сообщение · #9 |
|
Создано: 25 октября 2011 11:38 · Личное сообщение · #10 Опа-на, эта задачка не спроста! Хеш из сабжа это модифицированный На странице хэша есть Can you help solve some of the zero-hash challenges? We are interested in finding the shortest data sets, under certain constraints, that produce a FNV hash value of zero for the various sizes of the FNV-1 and FNV-1a hash function. Those who offer the best solution will receive fame and credit on the FNV web page. Интересно, посчитаю ка я решение для 64 битного FNV и напишу автору хеша. ----- PGP key |
|
Создано: 25 октября 2011 12:54 · Личное сообщение · #11 |
|
Создано: 25 октября 2011 13:19 · Личное сообщение · #12 PE_Kill пишет: А ты уверен, что можно подобрать 8 байтовые входные данные под любой хеш? Скорее всего нельзя. Но я уже написал прогу которая найдет такие данные, если они вообще существуют. Если нельзя подобрать под 8 байт, можно попробовать под 9, есть соображения как улучшить атаку еще на 1 байт и перебирать 4+3 байт из 8ми или 4+4 (3+5) из 9ти. ----- PGP key |
|
Создано: 25 октября 2011 16:12 · Личное сообщение · #13 Результаты для 8ми байт. Найдены улучшенной атакой со сложностью 2^32 + 2^24 операций и 2^24 памяти. FNV64_1a(d5 6b b9 53 42 87 08 36) == 0 FNV64_1(x) == 0 для 8ми байт решений не имеет ----- PGP key | Сообщение посчитали полезным: r_e |
|
Создано: 25 октября 2011 16:38 · Личное сообщение · #14 |
|
Создано: 25 октября 2011 16:44 · Личное сообщение · #15 vasyaC пишет: Можно мне в личку алгоритм улучшенной атаки? Нельзя. Я это делаю не за бабло, а ради интереса. ----- PGP key | Сообщение посчитали полезным: yagello, SReg, _ruzmaz_ |
|
Создано: 25 октября 2011 16:50 · Личное сообщение · #16 |
|
Создано: 25 октября 2011 17:05 · Личное сообщение · #17 для брута 8 байт встречей точно посередине потребуется 2^32 элементов памяти по 12 байт (8 байт на хеш + 4 байта на значение) и 2^32 + 2^32 операций. Это 48 гигов оперативки. Но 1 байт легко вычислить без перебора, поэтому сложность понижается до 2^24 элементов памяти по 11 байт и 2^24 + 2^32 операций. Я сейчас запустил брут по улучшенному алгоритму для 9 байт FNV64_1, такой брут имеет сложность 2^24 элементов памяти по 11 байт и 2^24 + 2^40 операций. Подробности в личку, чтобы шароварщик не ловил тут халяву. UPD найдено первое решение: FNV64_1(92 06 77 4c e0 2f 89 2a d2) == 0 ----- PGP key |
|
Создано: 26 октября 2011 13:35 · Личное сообщение · #18 |
|
Создано: 26 октября 2011 14:57 · Личное сообщение · #19 |
|
Создано: 27 октября 2011 12:56 · Личное сообщение · #20 |
|
Создано: 06 ноября 2011 18:25 · Поправил: bowrouco · Личное сообщение · #21 ntldr Подскажите на счёт циклического ксора, тоесть: Code:
Это для кода B1B2B3... вычисляется хеш. Известен хеш(H4H3H2H1), размер(число итераций Iters), B1, возможно есчо B2 и B3. Максимальное число итераций - 32. Необходимо восстановить код по хешу с минимальным количеством итераций. Функция такая: Code:
У меня получилось Iters = 2^(8*(Len - 5)), для Iters > 5. Для 6 итераций можно разложить: B6 = H1^H4 B5 = H2^H3^H4 B4 = B1^B2^H3 ; B2 брутим. B3 = B2^H2^H3 = B1^B4^H3^H4 Для 7 так не удаётся разложить почемуто, Bn-1 != f(Bn). 8154_06.11.2011_EXELAB.rU.tgz - Hash.png |
|
Создано: 06 ноября 2011 18:32 · Личное сообщение · #22 |
|
Создано: 06 ноября 2011 18:36 · Личное сообщение · #23 |
eXeL@B —› Основной форум —› Как обратить хэш функцию? |