Сейчас на форуме: _MBK_, user99, ManHunter, Magister Yoda (+8 невидимых) |
![]() |
eXeL@B —› Основной форум —› Хеш функция |
Посл.ответ | Сообщение |
|
Создано: 24 сентября 2005 07:59 · Поправил: Paxan · Личное сообщение · #1 Имеется хеш функция такого вида: unsigned int hash(char *data, int len) { unsigned int i1 = 0, i2 = 0; for (int i=0;i<len;i++) { i1 += data[i]; i2 += i1; } i1 %= 65521; i2 %= 65521; i2 <<= 16; return i2 | i1; } В которой собственно i1 %= 65521; i2 %= 65521; ОЧЕНЬ редко влияют на конечный результат Поэтому смело упрощаем до: unsigned int hash(char *data, int len) { unsigned int i1 = 0, i2 = 0; for (int i=0;i<len;i++) { i1 += data[i];; i2 += i1; } i2 <<= 16; return i2 | i1; } Внимание вопрос знатокам ![]() Надо из получившегося значения(назовём ключом) получить валидные данные, которые: hash("полученные валидные данные") == hash("оригинал") У меня получилось только получить оригинальные i1, i2: int i1 = 0,i2 = 0; i2 = key >> 16; i1 = (short int)key; Т.е. осталось по двум цифрам получить строку. Какие будут соображения? ![]() PS: Мне НЕ нужен оригинал от хеш-фукнции, а нужна валидная строка. ![]() |
|
Создано: 24 сентября 2005 08:43 · Поправил: Stiver · Личное сообщение · #2 Пока только бегло просмотрел, если не ошибаюсь, вот это for (int i=0;i<len;i++) { i1 += data[ i ]; i2 += i1; } можно записать следующим образом: Sum_{i=1}^{len} x_{i} = i1 mod 65521 Sum_{i=1}^{len}(len+1-i)*x_{i} = i2 mod 65521 где data = x_{1}x_{2}x_{3}.........x_{len} i1 = key & 0xFFFF i2 = key >> 16 ну а это обыкновенная (даже переопределенная для len>2) линейная система из 2х уравнений, подставляй любое len>1 какое нравится и решай. ОЧЕНЬ редко влияют на конечный результат Смотря какой длины строка... PS: Мне НЕ нужен оригинал от хеш-фукнции, а нужна валидная строка. А оригинал получить и не удастся, если только угадать... P.S. глюк форума: при правке [i] в data[i] интерпретируется как начало курсива, несмотря на то, что находится внутри [c][/c]. ![]() |
|
Создано: 24 сентября 2005 09:08 · Личное сообщение · #3 |
|
Создано: 24 сентября 2005 10:32 · Поправил: geRC · Личное сообщение · #4 Paxan 1. Для начала хотелось бы услышать некоторое уточнение задачи, например, предполагаемый размер входных данных. Если это небольшая строка, то это одно, а если кейфайл ~> 0.5 кб, то это совсем другое, потому что тогда i1 может быть после цикла больше, чем 65521. 2. После выполнения этих строк Paxan пишет: i1 %= 65521; i2 %= 65521; i1 == i2, так что нам достаточно рассматривать только i1. 3. Это не совсем понятно: Paxan пишет: У меня получилось только получить оригинальные i1, i2: int i1 = 0,i2 = 0; i2 = key >> 16; i1 = (short int)key; Я правильно понимаю, что i1=i2 должно равняться 0? 4. В любом случае, необходимо уточнить, что подается на вход этой функции, то есть какой диапазон занимают байты из data. 5. Все это очень похоже на задачу об укладке ранца. Если я правильно понимаю (см. пункт 3), то нам надо найти такую строку (в случае, если данные подаются на вход не из кейфайла, и у нас всего лишь небольшая строка), сумма символов которой равна 65521. Это сделать просто, такой алгоритм придумай сам ;) ![]() |
|
Создано: 24 сентября 2005 10:52 · Личное сообщение · #5 geRC пишет: 1. Для начала хотелось бы услышать некоторое уточнение задачи, например, предполагаемый размер входных данных. Есрли это небольшая стока, то это одно, а если кейфайл ~> 0.5 кб, то это совсем другое, потомуо что тогда i1 мжет быть после цикла больше, чем 65521. Если после цикла имеем i1 больше 65521, то "i1 %= 65521;" получаем всё равно два байта. Принципиальное значение это не имеет. Задача не стоит получить оригинал. geRC пишет: i1 == i2, так что нам достаточно рассматривать только i1. Это еще почему? geRC пишет: 4. В любом случае, необходимо уточнить, что подается на вход этой функции, то есть какой диапазон занимают байты из data. Это бывает и ascii строка и набор бесмыссленных байт длинной до килобайта. geRC пишет: 5. Все это очень похоже на задачу об укладке ранца. Если я правильно понимаю (см. пункт 3), то нам надо найти такую строку (в случае, если данные подаются на вход не из кейфайла, и у нас всего лишь небольшая строка), сумма символов которой равна 65521. Это сделать просто, такой алгоритм придумай сам ;) Нет, ранца тут никого нет ![]() У меня есть хеш, посчитанный от каких-то данных. Надо получить любой набор данных (только чтобы в них небыло \00), который бы удовлетворял хешу. ![]() |
|
Создано: 24 сентября 2005 11:23 · Поправил: geRC · Личное сообщение · #6 |
|
Создано: 24 сентября 2005 11:24 · Личное сообщение · #7 |
|
Создано: 24 сентября 2005 11:32 · Личное сообщение · #8 |
|
Создано: 24 сентября 2005 11:40 · Личное сообщение · #9 |
|
Создано: 24 сентября 2005 11:47 · Поправил: geRC · Личное сообщение · #10 Stiver ![]() Paxan Итак: Запишем систему (i1 = a, i2= b): [1] + [2] + ... [3] = a [1]*n + [2]*(n-1) + ... + [n]*1 = b или так: [1] + [2] + ... [n] = a [1] + ([1]+[2]) + ... + ([1]+[2]+..+[n]) = b => [1] + ([1]+[2]) + ... + ([1]+[2]+..+[n-1]) = b-a теперь ] [1] = (b-a) % (n-1) = c вычитаем: [2] + ([2]+[3]) + ... + ([2]+[3]+..[n-1]) = b - a - c*(n-1) и так далее... ![]() |
|
Создано: 24 сентября 2005 11:47 · Личное сообщение · #11 |
|
Создано: 24 сентября 2005 11:49 · Личное сообщение · #12 |
|
Создано: 24 сентября 2005 12:03 · Личное сообщение · #13 |
|
Создано: 24 сентября 2005 12:12 · Поправил: geRC · Личное сообщение · #14 |
|
Создано: 24 сентября 2005 12:30 · Личное сообщение · #15 |
|
Создано: 24 сентября 2005 13:25 · Поправил: geRC · Личное сообщение · #16 Relayer пишет: с каких это пор адлер стал хешем? вроде как по жизни он был контрольной суммой со всеми вытекающими А разве есть строгое определение? Как мы можем отделить одно понятие от другого? Вот, например, что говорит wikipedia: A hash function or hash algorithm is a function for summarizing or probabilistically identifying data. или так: A specialized type of function used to convert data with a large range to a smaller range. Под это определение адлер32 вполне попадает. Другое дело, что любая хорошая хэш-функция должна удовлетворять некоторым требованиям. И вот тут у адлера имхо проблемы. ![]() |
|
Создано: 24 сентября 2005 13:47 · Личное сообщение · #17 |
|
Создано: 24 сентября 2005 14:42 · Личное сообщение · #18 geRC пишет: любая хорошая хэш-функция должна удовлетворять некоторым требованиям смотря для каких целей. если для заполнения хеш таблицы - одни требования, если для крипто - то более жесткие. адлер изначально задумывался как контрольная сумма. я бы не называл его хешем ![]() ![]() ![]() |
|
Создано: 24 сентября 2005 14:51 · Поправил: Paxan2 · Личное сообщение · #19 |
|
Создано: 24 сентября 2005 14:56 · Поправил: geRC · Личное сообщение · #20 Relayer пишет: смотря для каких целей. если для заполнения хеш таблицы - одни требования, если для крипто - то более жесткие. Совершенно согласен ![]() ![]() Relayer пишет: хотя это возможно гдето терминологические ньюансы Да, мы немного ушли в оффтоп ![]() Paxan пишет: А его можно обратить? А что по-твоему означает "обратить"? Понятно, что исходные данные восстановить никак нельзя. Так что именно "обратить" неполучится. Это отображение не биективное. Relayer абсолютно верно сказал, что адлер изначально задумывался как контрольная сумма. То есть для проверки целостности данных, скажем от случайного повреждения. Однако никто не утверждает, что для частного случая нельзя подобрать такие входные значения, что мы получим нужную чексумму. Кстати, это же самое касается и CRC32. EDiTED> Paxan Paxan2 пишет: Abd:32178439 - строка:хеш если ставим в качестве рандомной буквы A - получаем оригинал. Если взять допустим 50: то http://paxan.clansiec.com/ddd.JPG http://paxan.clansiec.com/ddd.JPG хеш от полученного: 13369351 муть Как все это понимать? Если хочешь, чтобы тебе помогли, научись выражать свои мысли. Я умываю руки. EDiTED2> Дата: Сен 24, 2005 23:51:18 · Поправил: Paxan2 New! [муть] Всё ок =) Щастье есть ![]() ![]() ![]() пришло озарение! ![]() |
|
Создано: 24 сентября 2005 15:10 · Личное сообщение · #21 |
|
Создано: 24 сентября 2005 17:25 · Личное сообщение · #22 Relayer пишет: смотря для каких целей. если для заполнения хеш таблицы - одни требования, если для крипто - то более жесткие. адлер изначально задумывался как контрольная сумма. я бы не называл его хешем хотя это возможно гдето терминологические ньюансы как мне помнится с лекЦий криптографии, есть всего 4!!! условия, которым должен обладать "идеальный" хэш вне зависимости от его назна4ения (в этих 4 условия у4тено все) ----- HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE ![]() |
|
Создано: 24 сентября 2005 17:29 · Личное сообщение · #23 имхо в странную степь разговор пошел про "обратить": не симметри4еское ведь шифрование здесь, буть то хэш, или контрольная сумма... другое дело, 4то в реализации адлера может существовать коллизия, тогда 4то-то можно говорить об подделке контрольной суммы ----- HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE ![]() |
|
Создано: 25 сентября 2005 02:23 · Личное сообщение · #24 ProTeuS насчет 4х условий - это требования к криптографическому хешу. адлер, crc32 и прочея не удовлетворяют всем этим условиям. в частности достаточно несложно можно подобрать другое сообщение с таким же хешем. или модифицировать некоторое сообщение с целью получения заданного хеша. так что дело не в коллизиях, ибо любое сжимающее преобразование будет их иметь по определению. ![]() |
|
Создано: 25 сентября 2005 06:34 · Личное сообщение · #25 |
|
Создано: 25 сентября 2005 14:00 · Личное сообщение · #26 В аттаче програмка(вместе с исходниками), находящая к данному hashу коллизию заданной длины для adler32, если таковая вообще существует. То есть задаешь hash, желаемую длину строки и получаешь или какое-то из решений, или сообщение, что решения нет. При этом символы в строке берутся из диапазона 33-126, чтобы их можно было без особых проблем ввести с клавиатуры. Сделано с помощью симплекс-алгоритма, реализация которого взята из lp_solve. В принципе таким же образом "обращается" и любой другой алгоритм этого типа, если его можно свести к системе линейных уравнений. Может кому пригодится. ![]() ![]() |
|
Создано: 25 сентября 2005 14:08 · Личное сообщение · #27 |
|
Создано: 25 сентября 2005 18:37 · Личное сообщение · #28 > с каких это пор адлер стал хешем? вроде как по жизни он был > контрольной суммой со всеми вытекающими Ну извиняйте, гуру, я академиев не кончал, и как серое быдло со средним образованием, грешным делом считал, что любая функция делающая выжимку из сообщения это есть хэш. Век живи, век учись. Может меня кто просветит, чем же контрольная сумма кардинально отличается от хэша (слово "криптостойкий" в просвещении присутствовать не должно, это я и так знаю, и умышленно его не употребил =) ![]() |
|
Создано: 26 сентября 2005 05:02 · Личное сообщение · #29 |
![]() |
eXeL@B —› Основной форум —› Хеш функция |