С. система генирации.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by gold-goblin, 1 Oct 2009.

  1. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    Тут понадобилась придумать хитрую систему генерации но моих мозгов не хватает =(
    Есть сервер и клиент, дальше скажем так при вводе в клиенте и сервере одинакового пасса через соккет каждый раз должен уходить своеобразный пакет.
    То есть клиент каждый раз должен кодировать пасс по разному а сервер понимать его.
    (Так сказать динамический код)
    У кого какие предложения?
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    сервер шлет ключ шифрования. клиент им шифрует свой пас и отправляет серверу.
    Сервер расшифровывает пас и потом проверяет его.

    Если это организовать на основе шифрования с открытым ключем то довольно надежно. тем более что не обязательно делать всё на RSA, потому что есть и более простые в реализации алгоритмы асиметричного шифрования.
     
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Сервер рандомно генерит что то ,отсылает клиенту,тот склеивает его с паролем хеширует,шлет хеш серверу.При условии что серверу известен пароль он клеит его с тем же самым рандомным значением хеширует,и сравнивает с тем что прислал клиент.
     
  4. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    Сори забыл сказать, 1 из условий: сервер ничего не может послать клиенту
     
  5. ][yZ

    ][yZ Member

    Joined:
    3 Mar 2009
    Messages:
    66
    Likes Received:
    46
    Reputations:
    10
    генерируешь ключ, шифруешь им строку (любым алгоритмом), склеиваешь ключ с зашифрованной и отправляешь на сервер, на сервере расшифровываешь и сравниваешь с требуемым
     
  6. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Согласен,не обязательно сразу RSA алгоритмом пользоваться,главное чтобы был понятен смысла самого алгоритма.
     
  7. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    Можно по подробней что значит:"Склеиваешь ключ с зашифрованной"

    xismyname
    Я писал выше что сервер только принимает данные.
     
  8. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Ну тогда никак ее не зашифруешь динамическим ключом так чтобы сервер смог дешифровать.
     
  9. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    хм. Способ есть, к примеру автомобильные сигнализации используют динамический код без обратной связи (в нашем случае сервер ничего не шлет клиенту)
     
    1 person likes this.
  10. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    Ппц, самое элементарное - какой-нибудь рандомный ключ, по умолчанию в первом пакете он допустим между 17 и 25 символом.
    кодируешь пакет свой в base64, генерируешь ключ, вставляешь его в стартовую точку, в самом же пакете указываешь либо следующий ключ, либо его расположение.
    Единственное слабое место - это если выкупят алгоритм нахождения ключа сервером...
    точнее не так, сначал генерируешь ключ, потом пакет, потом вставляешь в него ключ )
    На крайняк можно установить что размер ключа - всегда 13 символов а сервер же пускай подбирает его из пакета, но тогда придется придумывать какой-либо опознавательный знак для начала и конца пакета... Да и ежели пакет/нагрузка будет нормальные то сервант надолго задумается....
     
    #10 login999, 1 Oct 2009
    Last edited: 1 Oct 2009
    1 person likes this.
  11. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Программа не автомобиль.
    Если хочешь чтобы сервер смог дешифровать твой текст то тебе придеться выслать на сервер и ключ шифрования,это означает что любой кто перехватит ключ сможет так же дешифровать тескт.
     
  12. Scripter

    Scripter Member

    Joined:
    3 Sep 2008
    Messages:
    141
    Likes Received:
    95
    Reputations:
    6
    тоже интересовал когда то такой вопрос, нагуглил следующее:

    Пусть диалог программ будет примерно следующий:
    Клиент (К): Я хочу залогиниться. Я Василиса Пупкина.
    Сервер (С): Хоти. Вот тебе число (генерирует и отсылает случайное число). Сложи его по маске XOR со своим паролем, посчитай MD5 хеш и пришли результат мне.
    К: Сейчас... (складывает пароль с присланным числом по маске XOR, считает MD5 хеш, отправляет результат). Вот!
    С: Ага, счас (смотрит в таблицу, где лежат пароли в открытом виде, сам проводит все нужные действия, сравнивает присланное число и то, что получилось) Да ты, никак действительно Василиса! Вот тебе уникальное число (генерирует и отправляет нечто вроде SessionID), запомни! (заводит запись, соответствующую заданному номеру, в которой будет хранить все, что относится к указанному клиенту).
    К: (запоминает число, отправляет его серверу при каждом обращении).
     
    1 person likes this.
  13. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Сервер ничего не отправляет,только принимает.
     
  14. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    вообще можно слегка скрывать инфу о ключе.
    К примеру. Клиент коннектится к серваку, получает порт который выдала ему винда для коннекта. Далее рандомным ключем криптит пароль, затем сцепляет этот рандомный ключ с шифрованным паролем и это шифруется номером этого порта.
    Сервер в свою очередь получает номер порта с которого коннектится клиент и в обратной последовательности всё делает. А если пароль разбавить мусором и потом шифровать то довольно хорошо будет получаться )

    Хотя можно замутить и по другому. Генерить ключ в определенном диапазоне чисел. к примеру от 0x00000000 до 0xFFFFFFFF это будет ключ шифрования. Ты береш пароль, вычисляеш его crc затем шифруеш. и передаеш серваку шифрованный пароль и crc
    а сервак когда получит начинает брутить ключ )) 4 милиадра операций на нормальном компа выполнятся за 1-2 секунуды.
     
    1 person likes this.
  15. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    917
    Likes Received:
    174
    Reputations:
    3
    А ты думаешь сигнализации это набор транзисторов и резисторов? Нет, сигналки уже давно микро контроллер в котором прошивка написана на С или ассемблере.
    Всем спасибо, я выбрал немного другой способ. Ничего кодировать не буду а просто сделаю рандом список и буду проверять есть ли пасс в списке (после использования в черный список).
    Ну или способ предложенный человеком долеким от программирования: "Кодировать абракадабру временем которое установлено в системе =) и если время одинаковое расшифровка будет одинаковая =)))
     
  16. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    В каждом TCP пакете указан порт отправителя и порт получателя,первые два поля TCP пакете,сам знаешь ;)
    Опять же есть риск что пакет могу перехватить и узнать порт.
     
  17. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    О. придумал еще один метод.
    Короче береш придумываеш любой генератор псевдослучайных чисел основанный на математических операциях(т.е. не юзаюзий таймер, часы, случайные велечины и rdtsc)
    И вот ты рандомом выбираеш начальное значение этого генератора. Затем рандомно генериш число повтороней. И далее начиная с этого начального значения впустую прогоняеш это кол-во повторений и последнее число будет считаться ключем шифрования пароля.
    Серваку ты шлеш начальное значение и кол-во повторов и шифрованный пароль.
    Он инициализирует этот же генератор и также прогоняет нужное кол-во повторов.И тем самым получает ключ для расшифровки пароля.

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

    Также можно сделать несколько разных генераторов и потом передавать номер используемого. или последовательность их использования. Защитить ГСЧ намного проще чем чтото другое, потому что его можно сделать очень сложным с точки зрения математических вычислений и размера.
     
    2 people like this.
  18. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    надо придумать что-нибудь типа генератор ключей, удовлетворяющих какой-нить функции. Например, что-нибудь вроде запрос состоит из как-то закодированных двух чисел A и B, и сервер проверяет, если B делится на 12634284628, A делится на 8330620174, и A делится на B, то принять ключ.

    slesh, а тебе не кажется, что генератор без случайной инициализации временем - чем угодно не является вообще случайным генератором, а просто выдаёт последовательность чисел?)
     
    1 person likes this.
  19. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 desTiny ну так почти все генераторы основаны на математической генерации последовательности и вся фишка именно в инициализации. Даже стандартный генератор в делфи и си - они математические. По этому их и назвали псевдослучайные.

    Другое дело генераторы основанные на более случайных числах или промежутках чисел. К примеру основанный на rdtsc потому как случайности вносит частота процессора, его производительность и загруженность системы и ты можеш сказать примерно какие значения он нагенерит но не сможеш сказать их точного значения.
    Вот тебе простой пример:
    Code:
     rdtsc // 0000098C D88D99BD
     mov ecx, eax
     mov ebx, edx
     rdtsc // 0000098C D88D99E2
    
    Как видиш за время выполнение нескольких машинных инструкций проц выполнил 37(0x25) тактов и такое примерно всё время было. При большей нагрузке на систему число начало меняться в диапазоне он 0x18 до 0x26 и это на моём проце. на твоем проце будут другие значения скорее всего.

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

    Кстати rdtsc очень удобно юзать для улучшения качества обычных ГСЧ потому что значения можно подмешивать в результаты обычного ГСЧ и таким образов давая большую случайность, а главное - типа небольшая и не напряжная дополнительная инициализация при каждой генерации
     
  20. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    ай прости, я неправильно понял, то что ты написал. мне показалось, что ты каким-то образом хочешь инициализировать генератор без всего этого.