Сейчас на форуме: _MBK_, user99, ManHunter, Magister Yoda (+8 невидимых)

 eXeL@B —› Основной форум —› Хеш функция
Посл.ответ Сообщение


Ранг: 104.1 (ветеран)
Активность: 0.070
Статус: Участник
искатель истЕны

Создано: 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: Мне НЕ нужен оригинал от хеш-фукнции, а нужна валидная строка.



Ранг: 48.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 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].




Ранг: 104.1 (ветеран)
Активность: 0.070
Статус: Участник
искатель истЕны

Создано: 24 сентября 2005 09:08
· Личное сообщение · #3

Stiver
Ок, попробую. Только я не совсем уверен, что до конца понял.



Ранг: 8.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 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. Это сделать просто, такой алгоритм придумай сам ;)




Ранг: 104.1 (ветеран)
Активность: 0.070
Статус: Участник
искатель истЕны

Создано: 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), который бы удовлетворял хешу.



Ранг: 8.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 24 сентября 2005 11:23 · Поправил: geRC
· Личное сообщение · #6

Paxan пишет:
Это еще почему?

Согласен, не заметил += во второй строке ))

Paxan пишет:
Это бывает и ascii строка и набор бесмыссленных байт длинной до килобайта.

Так а что значит "бывает"? Вот у меня есть i1 и i2, надо найти подходящую строку. Есть ли ограничения на её длину?



Ранг: 48.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 24 сентября 2005 11:24
· Личное сообщение · #7

geRC
Если это небольшая строка, то это одно, а если кейфайл ~> 0.5 кб, то это совсем другое, потому что тогда i1 может быть после цикла больше, чем 65521.

65521 - простое число, мы находимся в поле Z_{65521}, размер данных не имеет значения.



Ранг: 8.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 24 сентября 2005 11:32
· Личное сообщение · #8

Stiver пишет:
в поле Z_{65521}

Я бы даже сказал GF(65521)



Ранг: 48.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 24 сентября 2005 11:40
· Личное сообщение · #9

geRC
Я бы даже сказал GF(65521)

а они изоморфны



Ранг: 8.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 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)


и так далее...




Ранг: 104.1 (ветеран)
Активность: 0.070
Статус: Участник
искатель истЕны

Создано: 24 сентября 2005 11:47
· Личное сообщение · #11

geRC пишет:
Так а что значит "бывает"? Вот у меня есть i1 и i2, надо найти подходящую строку. Есть ли ограничения на её длину?

Нету.



Ранг: 8.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 24 сентября 2005 11:49
· Личное сообщение · #12

Paxan пишет:
Нету.

Ну тогда смотри выше.




Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 24 сентября 2005 12:03
· Личное сообщение · #13

Обращаем adler32 хэш? ну-ну...



Ранг: 8.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 24 сентября 2005 12:12 · Поправил: geRC
· Личное сообщение · #14

DrGolova пишет:
adler32 хэш

Доктор, это у вас такое отличное знание всех криптографических функций, или вы просто набрали !google 65521+hash ? В любом случае - спасибо

ЗЫ. _http://koders.com/?s=65521&_%3Abtn=Search&_%3Ala=%2A&_%3Ali=%2A



Ранг: 41.9 (посетитель)
Активность: 0.020
Статус: Участник
Author of EXECryptor

Создано: 24 сентября 2005 12:30
· Личное сообщение · #15

DrGolova пишет:
Обращаем adler32 хэш?


с каких это пор адлер стал хешем? вроде как по жизни он был контрольной суммой со всеми вытекающими



Ранг: 8.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 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 вполне попадает. Другое дело, что любая хорошая хэш-функция должна удовлетворять некоторым требованиям. И вот тут у адлера имхо проблемы.




Ранг: 104.1 (ветеран)
Активность: 0.070
Статус: Участник
искатель истЕны

Создано: 24 сентября 2005 13:47
· Личное сообщение · #17

DrGolova
А его можно обратить?



Ранг: 41.9 (посетитель)
Активность: 0.020
Статус: Участник
Author of EXECryptor

Создано: 24 сентября 2005 14:42
· Личное сообщение · #18

geRC пишет:
любая хорошая хэш-функция должна удовлетворять некоторым требованиям


смотря для каких целей. если для заполнения хеш таблицы - одни требования, если для крипто - то более жесткие. адлер изначально задумывался как контрольная сумма. я бы не называл его хешем хотя это возможно гдето терминологические ньюансы



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 сентября 2005 14:51 · Поправил: Paxan2
· Личное сообщение · #19

[муть]
Всё ок =) Щастье есть



Ранг: 8.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 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!
[муть]
Всё ок =) Щастье есть


пришло озарение!



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 24 сентября 2005 15:10
· Личное сообщение · #21

geRC пишет:
Если хочешь, чтобы тебе помогли, научись выражать свои мысли.

Это я чуть поторопился.



Ранг: 172.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 24 сентября 2005 17:25
· Личное сообщение · #22

Relayer пишет:
смотря для каких целей. если для заполнения хеш таблицы - одни требования, если для крипто - то более жесткие. адлер изначально задумывался как контрольная сумма. я бы не называл его хешем хотя это возможно гдето терминологические ньюансы


как мне помнится с лекЦий криптографии, есть всего 4!!! условия, которым должен обладать "идеальный" хэш вне зависимости от его назна4ения (в этих 4 условия у4тено все)

-----
HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE




Ранг: 172.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 24 сентября 2005 17:29
· Личное сообщение · #23

имхо в странную степь разговор пошел про "обратить": не симметри4еское ведь шифрование здесь, буть то хэш, или контрольная сумма...
другое дело, 4то в реализации адлера может существовать коллизия, тогда 4то-то можно говорить об подделке контрольной суммы

-----
HOW MUCH BLOOD WOULD YOU SHED TO STAY ALIVE




Ранг: 41.9 (посетитель)
Активность: 0.020
Статус: Участник
Author of EXECryptor

Создано: 25 сентября 2005 02:23
· Личное сообщение · #24

ProTeuS

насчет 4х условий - это требования к криптографическому хешу. адлер, crc32 и прочея не удовлетворяют всем этим условиям. в частности достаточно несложно можно подобрать другое сообщение с таким же хешем. или модифицировать некоторое сообщение с целью получения заданного хеша.
так что дело не в коллизиях, ибо любое сжимающее преобразование будет их иметь по определению.



Ранг: 4.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 25 сентября 2005 06:34
· Личное сообщение · #25

Всё, проблема окончательно решена Отдельное спасибо Stiver, geRC. Тему можно закрывать.



Ранг: 48.3 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 25 сентября 2005 14:00
· Личное сообщение · #26

В аттаче програмка(вместе с исходниками), находящая к данному hashу коллизию заданной длины для adler32, если таковая вообще существует. То есть задаешь hash, желаемую длину строки и получаешь или какое-то из решений, или сообщение, что решения нет. При этом символы в строке берутся из диапазона 33-126, чтобы их можно было без особых проблем ввести с клавиатуры.

Сделано с помощью симплекс-алгоритма, реализация которого взята из lp_solve. В принципе таким же образом "обращается" и любой другой алгоритм этого типа, если его можно свести к системе линейных уравнений. Может кому пригодится.


4051_adler32rev.zip



Ранг: 8.9 (гость)
Активность: 0.020
Статус: Участник

Создано: 25 сентября 2005 14:08
· Личное сообщение · #27

Stiver
Респект!




Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 25 сентября 2005 18:37
· Личное сообщение · #28

> с каких это пор адлер стал хешем? вроде как по жизни он был
> контрольной суммой со всеми вытекающими

Ну извиняйте, гуру, я академиев не кончал, и как серое быдло со средним образованием, грешным делом считал, что любая функция делающая выжимку из сообщения это есть хэш. Век живи, век учись. Может меня кто просветит, чем же контрольная сумма кардинально отличается от хэша (слово "криптостойкий" в просвещении присутствовать не должно, это я и так знаю, и умышленно его не употребил =)



Ранг: 41.9 (посетитель)
Активность: 0.020
Статус: Участник
Author of EXECryptor

Создано: 26 сентября 2005 05:02
· Личное сообщение · #29

http://encyclopedia.laborlawtalk.com/Checksum http://encyclopedia.laborlawtalk.com/Checksum


 eXeL@B —› Основной форум —› Хеш функция
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати