Просмотр полной версии : С. система генирации.
gold-goblin
01.10.2009, 14:15
Тут понадобилась придумать хитрую систему генерации но моих мозгов не хватает =(
Есть сервер и клиент, дальше скажем так при вводе в клиенте и сервере одинакового пасса через соккет каждый раз должен уходить своеобразный пакет.
То есть клиент каждый раз должен кодировать пасс по разному а сервер понимать его.
(Так сказать динамический код)
У кого какие предложения?
сервер шлет ключ шифрования. клиент им шифрует свой пас и отправляет серверу.
Сервер расшифровывает пас и потом проверяет его.
Если это организовать на основе шифрования с открытым ключем то довольно надежно. тем более что не обязательно делать всё на RSA, потому что есть и более простые в реализации алгоритмы асиметричного шифрования.
Сервер рандомно генерит что то ,отсылает клиенту,тот склеивает его с паролем хеширует,шлет хеш серверу.При условии что серверу известен пароль он клеит его с тем же самым рандомным значением хеширует,и сравнивает с тем что прислал клиент.
gold-goblin
01.10.2009, 14:46
Сори забыл сказать, 1 из условий: сервер ничего не может послать клиенту
генерируешь ключ, шифруешь им строку (любым алгоритмом), склеиваешь ключ с зашифрованной и отправляешь на сервер, на сервере расшифровываешь и сравниваешь с требуемым
xismyname
01.10.2009, 19:01
сервер шлет ключ шифрования. клиент им шифрует свой пас и отправляет серверу.
Сервер расшифровывает пас и потом проверяет его.
Если это организовать на основе шифрования с открытым ключем то довольно надежно. тем более что не обязательно делать всё на RSA, потому что есть и более простые в реализации алгоритмы асиметричного шифрования.
Согласен,не обязательно сразу RSA алгоритмом пользоваться,главное чтобы был понятен смысла самого алгоритма.
gold-goblin
01.10.2009, 19:54
генерируешь ключ, шифруешь им строку (любым алгоритмом), склеиваешь ключ с зашифрованной и отправляешь
Можно по подробней что значит:"Склеиваешь ключ с зашифрованной"
xismyname
Я писал выше что сервер только принимает данные.
xismyname
01.10.2009, 22:54
Можно по подробней что значит:"Склеиваешь ключ с зашифрованной"
xismyname
Я писал выше что сервер только принимает данные.
Ну тогда никак ее не зашифруешь динамическим ключом так чтобы сервер смог дешифровать.
gold-goblin
01.10.2009, 23:07
хм. Способ есть, к примеру автомобильные сигнализации используют динамический код без обратной связи (в нашем случае сервер ничего не шлет клиенту)
login999
01.10.2009, 23:25
Ппц, самое элементарное - какой-нибудь рандомный ключ, по умолчанию в первом пакете он допустим между 17 и 25 символом.
кодируешь пакет свой в base64, генерируешь ключ, вставляешь его в стартовую точку, в самом же пакете указываешь либо следующий ключ, либо его расположение.
Единственное слабое место - это если выкупят алгоритм нахождения ключа сервером...
точнее не так, сначал генерируешь ключ, потом пакет, потом вставляешь в него ключ )
На крайняк можно установить что размер ключа - всегда 13 символов а сервер же пускай подбирает его из пакета, но тогда придется придумывать какой-либо опознавательный знак для начала и конца пакета... Да и ежели пакет/нагрузка будет нормальные то сервант надолго задумается....
xismyname
01.10.2009, 23:28
хм. Способ есть, к примеру автомобильные сигнализации используют динамический код без обратной связи (в нашем случае сервер ничего не шлет клиенту)
Программа не автомобиль.
Если хочешь чтобы сервер смог дешифровать твой текст то тебе придеться выслать на сервер и ключ шифрования,это означает что любой кто перехватит ключ сможет так же дешифровать тескт.
Scripter
01.10.2009, 23:36
тоже интересовал когда то такой вопрос, нагуглил следующее:
Пусть диалог программ будет примерно следующий:
Клиент (К): Я хочу залогиниться. Я Василиса Пупкина.
Сервер (С): Хоти. Вот тебе число (генерирует и отсылает случайное число). Сложи его по маске XOR со своим паролем, посчитай MD5 хеш и пришли результат мне.
К: Сейчас... (складывает пароль с присланным числом по маске XOR, считает MD5 хеш, отправляет результат). Вот!
С: Ага, счас (смотрит в таблицу, где лежат пароли в открытом виде, сам проводит все нужные действия, сравнивает присланное число и то, что получилось) Да ты, никак действительно Василиса! Вот тебе уникальное число (генерирует и отправляет нечто вроде SessionID), запомни! (заводит запись, соответствующую заданному номеру, в которой будет хранить все, что относится к указанному клиенту).
К: (запоминает число, отправляет его серверу при каждом обращении).
xismyname
01.10.2009, 23:45
тоже интересовал когда то такой вопрос, нагуглил следующее:
Пусть диалог программ будет примерно следующий:
Клиент (К): Я хочу залогиниться. Я Василиса Пупкина.
Сервер (С): Хоти. Вот тебе число (генерирует и отсылает случайное число). Сложи его по маске XOR со своим паролем, посчитай MD5 хеш и пришли результат мне.
К: Сейчас... (складывает пароль с присланным числом по маске XOR, считает MD5 хеш, отправляет результат). Вот!
С: Ага, счас (смотрит в таблицу, где лежат пароли в открытом виде, сам проводит все нужные действия, сравнивает присланное число и то, что получилось) Да ты, никак действительно Василиса! Вот тебе уникальное число (генерирует и отправляет нечто вроде SessionID), запомни! (заводит запись, соответствующую заданному номеру, в которой будет хранить все, что относится к указанному клиенту).
К: (запоминает число, отправляет его серверу при каждом обращении).
Сервер ничего не отправляет,только принимает.
вообще можно слегка скрывать инфу о ключе.
К примеру. Клиент коннектится к серваку, получает порт который выдала ему винда для коннекта. Далее рандомным ключем криптит пароль, затем сцепляет этот рандомный ключ с шифрованным паролем и это шифруется номером этого порта.
Сервер в свою очередь получает номер порта с которого коннектится клиент и в обратной последовательности всё делает. А если пароль разбавить мусором и потом шифровать то довольно хорошо будет получаться )
Хотя можно замутить и по другому. Генерить ключ в определенном диапазоне чисел. к примеру от 0x00000000 до 0xFFFFFFFF это будет ключ шифрования. Ты береш пароль, вычисляеш его crc затем шифруеш. и передаеш серваку шифрованный пароль и crc
а сервак когда получит начинает брутить ключ )) 4 милиадра операций на нормальном компа выполнятся за 1-2 секунуды.
gold-goblin
01.10.2009, 23:55
Программа не автомобиль.
А ты думаешь сигнализации это набор транзисторов и резисторов? Нет, сигналки уже давно микро контроллер в котором прошивка написана на С или ассемблере.
Всем спасибо, я выбрал немного другой способ. Ничего кодировать не буду а просто сделаю рандом список и буду проверять есть ли пасс в списке (после использования в черный список).
Ну или способ предложенный человеком долеким от программирования: "Кодировать абракадабру временем которое установлено в системе =) и если время одинаковое расшифровка будет одинаковая =)))
xismyname
02.10.2009, 01:52
вообще можно слегка скрывать инфу о ключе.
К примеру. Клиент коннектится к серваку, получает порт который выдала ему винда для коннекта. Далее рандомным ключем криптит пароль, затем сцепляет этот рандомный ключ с шифрованным паролем и это шифруется номером этого порта.
Сервер в свою очередь получает номер порта с которого коннектится клиент и в обратной последовательности всё делает. А если пароль разбавить мусором и потом шифровать то довольно хорошо будет получаться )
Хотя можно замутить и по другому. Генерить ключ в определенном диапазоне чисел. к примеру от 0x00000000 до 0xFFFFFFFF это будет ключ шифрования. Ты береш пароль, вычисляеш его crc затем шифруеш. и передаеш серваку шифрованный пароль и crc
а сервак когда получит начинает брутить ключ )) 4 милиадра операций на нормальном компа выполнятся за 1-2 секунуды.
В каждом TCP пакете указан порт отправителя и порт получателя,первые два поля TCP пакете,сам знаешь ;)
Опять же есть риск что пакет могу перехватить и узнать порт.
О. придумал еще один метод.
Короче береш придумываеш любой генератор псевдослучайных чисел основанный на математических операциях(т.е. не юзаюзий таймер, часы, случайные велечины и rdtsc)
И вот ты рандомом выбираеш начальное значение этого генератора. Затем рандомно генериш число повтороней. И далее начиная с этого начального значения впустую прогоняеш это кол-во повторений и последнее число будет считаться ключем шифрования пароля.
Серваку ты шлеш начальное значение и кол-во повторов и шифрованный пароль.
Он инициализирует этот же генератор и также прогоняет нужное кол-во повторов.И тем самым получает ключ для расшифровки пароля.
В этоге для того чтобы расшифровать нужно знать алгоритм работы данного генератора псевдослучайных чисел. А для этого придется или декомпильнуть серверную часть или клиентскую.
Также можно сделать несколько разных генераторов и потом передавать номер используемого. или последовательность их использования. Защитить ГСЧ намного проще чем чтото другое, потому что его можно сделать очень сложным с точки зрения математических вычислений и размера.
надо придумать что-нибудь типа генератор ключей, удовлетворяющих какой-нить функции. Например, что-нибудь вроде запрос состоит из как-то закодированных двух чисел A и B, и сервер проверяет, если B делится на 12634284628, A делится на 8330620174, и A делится на B, то принять ключ.
генератор псевдослучайных чисел основанный на математических операциях(т.е. не юзаюзий таймер, часы, случайные велечины и rdtsc)
slesh, а тебе не кажется, что генератор без случайной инициализации временем - чем угодно не является вообще случайным генератором, а просто выдаёт последовательность чисел?)
2 desTiny ну так почти все генераторы основаны на математической генерации последовательности и вся фишка именно в инициализации. Даже стандартный генератор в делфи и си - они математические. По этому их и назвали псевдослучайные.
Другое дело генераторы основанные на более случайных числах или промежутках чисел. К примеру основанный на rdtsc потому как случайности вносит частота процессора, его производительность и загруженность системы и ты можеш сказать примерно какие значения он нагенерит но не сможеш сказать их точного значения.
Вот тебе простой пример:
rdtsc // 0000098C D88D99BD
mov ecx, eax
mov ebx, edx
rdtsc // 0000098C D88D99E2
Как видиш за время выполнение нескольких машинных инструкций проц выполнил 37(0x25) тактов и такое примерно всё время было. При большей нагрузке на систему число начало меняться в диапазоне он 0x18 до 0x26 и это на моём проце. на твоем проце будут другие значения скорее всего.
Вот тебе и генератор небольших случайных чисел. не требующий инициализации и не выдающий последовательность чисел. очень хорош генератор для небольших чисел с не очень частым использованием. Но необходимо учитывать тот факт что rdtsc часто выдает числа только четные )
Кстати rdtsc очень удобно юзать для улучшения качества обычных ГСЧ потому что значения можно подмешивать в результаты обычного ГСЧ и таким образов давая большую случайность, а главное - типа небольшая и не напряжная дополнительная инициализация при каждой генерации
ай прости, я неправильно понял, то что ты написал. мне показалось, что ты каким-то образом хочешь инициализировать генератор без всего этого.
login999
03.10.2009, 10:23
Вариант можно усложнить - генерировать допустим число длиной в восемь цифр, из них же выбирать допустим первых/последних/по хер-ти пойми какой системе только три или четыре, потом допустим над этими тремя произвести какую-нибудь математическую операцию там сложить, возвести в степень и т.д.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot