Как "зашить" в ключе данные клиента
От: Kiper Израиль  
Дата: 04.05.04 10:13
Оценка:
У меня следующая задача: я должен при генерировании лицензионного номера для клиента "вшивать" в этот самый номер его данные, например, имя, фамилию, название фирмы. Так, чтобы при печатании документов у последнего все эти данные извлекались обратно, из лицензии, и чтобы невозможно было их править на ходу. Соответственно, для каждого клиента генерится свой уникальный ключ и т.п. Если кто знает, где можно накопать исходники, желательно на С++, буду премного благодарен. Уж очень не хочется велосипед изобретать.
Жизненный опыт похож на выигрышную лотерею, купленную после тиража.
Re: Как "зашить" в ключе данные клиента
От: RU_Ban0K www.iNT3.net
Дата: 04.05.04 10:34
Оценка:
Критичен ли для вас размер ключа?
Если нет, то самый лёгкий способ (и самый ... короче в подделке ключа нет проблем) просто закодировать данные по любому алгоритму, хоть XOR+ROR...
Если ключик желательно меньшего размера, то можно просто создать мутную хэшь функцию и при каждой печати сверять хэшь от данных которые вы храните в реестре || *.ini || где там ещё, с хэшем созданом при регистрации... (лучше конечно сравнивать хэшь от хэшь, или ещё что либо подобное... только не на прямую...)
Re[2]: Как "зашить" в ключе данные клиента
От: Kiper Израиль  
Дата: 04.05.04 13:09
Оценка:
Здравствуйте, RU_Ban0K, Вы писали:

RU_>Критичен ли для вас размер ключа?

RU_>Если нет, то самый лёгкий способ (и самый ... короче в подделке ключа нет проблем) просто закодировать данные по любому алгоритму, хоть XOR+ROR...
RU_>Если ключик желательно меньшего размера, то можно просто создать мутную хэшь функцию и при каждой печати сверять хэшь от данных которые вы храните в реестре || *.ini || где там ещё, с хэшем созданом при регистрации... (лучше конечно сравнивать хэшь от хэшь, или ещё что либо подобное... только не на прямую...)

Размер ключа не критичен. Я вообще подумываю о том, чтобы не утомлять юзера нудным перепечатыванием, а предложить ему поместить файл с ключом в нужное окошко (drag-drop), и на этом "тяжелая" миссия юзера заканчивается.
Жизненный опыт похож на выигрышную лотерею, купленную после тиража.
Re: Как "зашить" в ключе данные клиента
От: retalik www.airbandits.com/
Дата: 04.05.04 14:14
Оценка: 5 (3)
Здравствуйте, Kiper, Вы писали:

K>У меня следующая задача: я должен при генерировании лицензионного номера для клиента "вшивать" в этот самый номер его данные, например, имя, фамилию, название фирмы. Так, чтобы при печатании документов у последнего все эти данные извлекались обратно, из лицензии, и чтобы невозможно было их править на ходу. Соответственно, для каждого клиента генерится свой уникальный ключ и т.п. Если кто знает, где можно накопать исходники, желательно на С++, буду премного благодарен. Уж очень не хочется велосипед изобретать.


Сам механизм формирования ключей можно сделать на основе асимметричного шифрования, например, того же RSA.
То есть, сначала генерируется пара ключей: публичный и приватный. Публичный "вшивается" в программу и используется при проверке регистрационной информации. Приватный хранится только на Вашей машине и используется в кейгене.

Схема такая:
— покупатель присылает свои регистрационные данные (имя, e-mail, еще что-то);
— кейген создает блок регистрационного кода, шифруя эти данные приватным ключом;
— этот код пересылается пользователю, он вводит его в окно регистрации;
— программа пытается раскодировать эти данные публичным ключом.

С точки зрения криптографии, схема почти идеальная. Но в реальной жизни у нее куча недостатков.

Минусы я вижу такие:
1. Длинные регистрационные коды. Придется заставлять юзера делать Copy/Paste.
2. Большинство алгоритмов, реализующих RSA, применяют обратный способ (public encryption -> pivate decryption), поэтому нужную реализацию придется поискать. Например, в библиотеке Crypto++ ее нет.
3. Крякер может отломить только проверку регистрации, оставив в покое сам ключ.
4. Ну и возможен более хитрый взлом. Крякер сгенерирует свою пару ключей и встроит в программу свой публичный ключ. При этом заработает его собственный кейген.

Поэтому такая защита будет работать только в комплексе с проверкой целостности программы.
Успехов,
Виталий.
Re: Как "зашить" в ключе данные клиента
От: cahbi7 Россия  
Дата: 04.05.04 16:58
Оценка:
Здравствуйте, Kiper, Вы писали:

K>У меня следующая задача: я должен при генерировании лицензионного номера для клиента "вшивать" в этот самый номер его данные, например, имя, фамилию, название фирмы. Так, чтобы при печатании документов у последнего все эти данные извлекались обратно, из лицензии, и чтобы невозможно было их править на ходу. Соответственно, для каждого клиента генерится свой уникальный ключ и т.п. Если кто знает, где можно накопать исходники, желательно на С++, буду премного благодарен. Уж очень не хочется велосипед изобретать.


можно использовать SDK сторонних разработчиков. Например Hardkey License Manager, тут и волки сыты (инфа о юзере забита в ключ) и овцы целы (длина ключа ~25 символов).
Re[2]: Как "зашить" в ключе данные клиента
От: Doc Россия http://andrey.moveax.ru
Дата: 05.05.04 04:49
Оценка:
Здравствуйте, retalik, Вы писали:

R>2. Большинство алгоритмов, реализующих RSA, применяют обратный способ (public encryption -> pivate decryption), поэтому нужную реализацию придется поискать. Например, в библиотеке Crypto++ ее нет.


Я ковярялся с алгоритмами, поставляемыми с Windows. Поэтому есть вопрос:
Просвятите, а какая разница каким ключем кодировать, а каким декодировать?
Все равно ведь даже в этом случае обладая только одним ключем (пусть даже private)
как я понимаю неврозможно закодировать данные правильно.
Т.е. необходимо что бы работало private encryption -> pivate decryption. Или я что-то не понял?
Re[3]: Как "зашить" в ключе данные клиента
От: retalik www.airbandits.com/
Дата: 05.05.04 06:38
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Просвятите, а какая разница каким ключем кодировать, а каким декодировать?

Doc>Все равно ведь даже в этом случае обладая только одним ключем (пусть даже private)
Doc>как я понимаю неврозможно закодировать данные правильно.
Doc>Т.е. необходимо что бы работало private encryption -> pivate decryption. Или я что-то не понял?
Видимо, что-то не понял
Асимметричное шифрование использует пару ключей. Причем преобразование одностороннее. Закодировав сообщение одним ключом, невозможно его декодировать при помощи этого же ключа.
Успехов,
Виталий.
Re[4]: Как "зашить" в ключе данные клиента
От: Doc Россия http://andrey.moveax.ru
Дата: 05.05.04 07:33
Оценка:
Здравствуйте, retalik, Вы писали:

R>Видимо, что-то не понял

R>Асимметричное шифрование использует пару ключей. Причем преобразование одностороннее. Закодировав сообщение одним ключом, невозможно его декодировать при помощи этого же ключа.

Так и я о том же. Вопрос — остает прежним. Вы писали:

R>2. Большинство алгоритмов, реализующих RSA, применяют обратный способ (public encryption -> pivate decryption), поэтому нужную реализацию придется поискать. Например, в библиотеке Crypto++ ее нет.


Я спрашиваю — какая разница каким шифровать? Т.е. если прогграммист шифрует при помоши public свой key, а в программе есть ТОЛЬКО private для расшифровки, то в чем могут быть вилы?

PS: В этом случае лушче использовать подпись, если в самой инфо нет ничего секретного
Re[5]: Как "зашить" в ключе данные клиента
От: retalik www.airbandits.com/
Дата: 07.05.04 16:50
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Я спрашиваю — какая разница каким шифровать? Т.е. если прогграммист шифрует при помоши public свой key, а в программе есть ТОЛЬКО private для расшифровки, то в чем могут быть вилы?

Пока ответить толком не могу. Но спросил знающего человека. Ответит — обязательно процитирую здесь.

Doc>PS: В этом случае лушче использовать подпись, если в самой инфо нет ничего секретного

В том и прелесть шифрования, что в инфе можно спрятать: имя юзера, его e-mail, тип лицензии и даже время действия ключа.
Успехов,
Виталий.
Re[6]: Как "зашить" в ключе данные клиента
От: Doc Россия http://andrey.moveax.ru
Дата: 07.05.04 17:36
Оценка:
Здравствуйте, retalik, Вы писали:

R>Здравствуйте, Doc, Вы писали:


Doc>>Я спрашиваю — какая разница каким шифровать? Т.е. если прогграммист шифрует при помоши public свой key, а в программе есть ТОЛЬКО private для расшифровки, то в чем могут быть вилы?

R>Пока ответить толком не могу. Но спросил знающего человека. Ответит — обязательно процитирую здесь.

Будет интересно. Пока скажу что я думаю:

* теоретически: просто придется поменять названия ключей. Тот что отдали теперь назовем public, тот что оставили private.

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

Doc>>PS: В этом случае лушче использовать подпись, если в самой инфо нет ничего секретного

R>В том и прелесть шифрования, что в инфе можно спрятать: имя юзера, его e-mail, тип лицензии и даже время действия ключа.

Хм... юзер и так знает (и вероятно может вводит) свое имя, email итд
тип лицензии, время действия и так предназначено для показа.
Вывод: разбиваем все на 2 части.
* из личных данных получаем хэш и подписывает. (потом запрашиваем юзера и сравниваем хеши и действительность подписи)
* остальное шифруем любым простым алгоритмом и подписываем. По прибытию просто проверяем подпись.
Re[6]: Как "зашить" в ключе данные клиента
От: retalik www.airbandits.com/
Дата: 08.05.04 13:29
Оценка: 19 (2)
Здравствуйте, retalik, Вы писали:

R>Пока ответить толком не могу. Но спросил знающего человека. Ответит — обязательно процитирую здесь.

Ответ специалиста по криптографии:

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

Но на практике ключ RSA состоит из двух частей: большого числа,
называемого модулем (и этот модуль один и тот же для Public и Private
в одной паре) и числа, называемого экспонентой. В одной паре у Public
и Private экспоненты связаны математически, и могут быть получены одна
из другой, но только если известно разложение модуля на простые
сомножители (а это — сложная математическая задача, составляющая ядро
RSA).

Так вот, чем меньше значение экспоненты. тем быстрее производятся
вычисления. Поэтому чаще всего в качестве Public exponent выбирают
небольшое простое число — 3, 5, 7, 0x10001, и по ним вычисляют Private
exponent (которая, в общем случае, будет по длине соизмерима с
модулем, то есть, например, 1024 бита для RSA-1024).

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

Успехов,
Виталий.
Re[2]: Как "зашить" в ключе данные клиента
От: Аноним  
Дата: 11.07.04 14:57
Оценка:
Здравствуйте, retalik, Вы писали:

R>2. Большинство алгоритмов, реализующих RSA, применяют обратный способ (public encryption -> pivate decryption), поэтому нужную реализацию придется поискать. Например, в библиотеке Crypto++ ее нет.

А подскажите где взять RSA, чтобы криптовал приватным ключом. А то я сам с Crypto++ подвязался, но обнаружил что он так не может.
Re[5]: Как "зашить" в ключе данные клиента
От: CEMb  
Дата: 12.07.04 06:47
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Я спрашиваю — какая разница каким шифровать? Т.е. если прогграммист шифрует при помоши public свой key, а в программе есть ТОЛЬКО private для расшифровки, то в чем могут быть вилы?


Тут вроде никакой. Но вообще разница такая:
Если вы используете этот способ шифрования для своих данных, то свой публичный ключ вы можете давать кому угодно. Кто угодно этим ключом шифрует данные, которые хочет вам передать, если кто и перехватит данные, расшифовать не сможет, как и другие владельцы публичного ключа, только владелец приватного. Очень удобно.
Re[6]: Как "зашить" в ключе данные клиента
От: Аноним  
Дата: 12.07.04 07:18
Оценка:
Здравствуйте, CEMb, Вы писали:

C>Тут вроде никакой. Но вообще разница такая: ...

Ага, никакой. Только один небольшой ньюанс. Имея private ключ, можно получить public, а значит и можно генерировать свои левые рег. ключи и программа будет кушать.
А надо чтобы было наоборот, т.к. из public ключа нельзя получить private, вот поэтому я и ищу такую реализацию RSA.
Re[7]: Как "зашить" в ключе данные клиента
От: Doc Россия http://andrey.moveax.ru
Дата: 12.07.04 07:44
Оценка:
Здравствуйте, Аноним, Вы писали:

C>>Тут вроде никакой. Но вообще разница такая: ...

А>Ага, никакой. Только один небольшой ньюанс. Имея private ключ, можно получить public, а значит и можно генерировать свои левые рег. ключи и программа будет кушать.
А>А надо чтобы было наоборот, т.к. из public ключа нельзя получить private, вот поэтому я и ищу такую реализацию RSA.

Вообще IMHO из одного ключа другой не получишь.А вот то, что библиотеки как правило сохраняют или public или пару private/public это уже проблема реализаций.

Кстати, как я говорил если данные не секретные, то можно использовать механизм подписей. Тогда public гуляет с программой, а пара private/publiс лежит у разработчика для подписи отправленных им данных.
Re[8]: Как "зашить" в ключе данные клиента
От: Аноним  
Дата: 12.07.04 07:55
Оценка:
Здравствуйте, Doc, Вы писали:

D>Вообще IMHO из одного ключа другой не получишь.

Are you sure?
Разве из private нельзя получить public?

D>Кстати, как я говорил если данные не секретные, то можно использовать механизм подписей.

Не это не годится, во первых в самом ключе может быть разнообразная скрытая информация, во вторых увиличивается объем ключа, т.к. с ключом надо передавать саму подписываемую информацию плюс подпись.
Re[9]: Как "зашить" в ключе данные клиента
От: Doc Россия http://andrey.moveax.ru
Дата: 12.07.04 08:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Разве из private нельзя получить public?

Спорить не буду. Это к теоретикам.
Я как правило наталкивался на экспорт пары ключей. Поэтому если вы экспортируете private, то экспортируете в эту же запись и public. А значит "получать" его в этом случае не надо, т.к. он уже есть. Выделить чистый privatу не пробовал.


D>>Кстати, как я говорил если данные не секретные, то можно использовать механизм подписей.

А>Не это не годится, во первых в самом ключе может быть разнообразная скрытая информация, во вторых увиличивается объем ключа, т.к. с ключом надо передавать саму подписываемую информацию плюс подпись.

Насчет секьрности данных это уже дело частное (хотя можно совместить подпись и шифрование данные алгоритмами по-проще). А вот насчет размера — можно подумать что мегабайты добавляются.
Re[3]: Как "зашить" в ключе данные клиента
От: Аноним  
Дата: 13.07.04 14:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А подскажите где взять RSA, чтобы криптовал приватным ключом.

Лююююююююди, вы где?
Елки, неужели все навесные защиты пользуют ?
Или все в отпусках, retalik куда-то делся, я чуствую он должен знать
Re[4]: Как "зашить" в ключе данные клиента
От: PVA  
Дата: 14.07.04 06:26
Оценка:
Здраствуйте,

А>>А подскажите где взять RSA, чтобы криптовал приватным ключом.



Ответ специалиста по криптографии:

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


Из одного ключа второй не получить. Возьми любую библиотеку и вперед, с песней.
newbie
Re[5]: Как "зашить" в ключе данные клиента
От: Doc Россия http://andrey.moveax.ru
Дата: 14.07.04 08:34
Оценка:
Здравствуйте, PVA, Вы писали:

PVA>Из одного ключа второй не получить. Возьми любую библиотеку и вперед, с песней.

Любую которая даст возможность экспортировать private ключ (а не пару private/public).
Проверить просто (если мануал читать лень) — экспортируем private и из результата импортируем public. Если удалось — значит была пара.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.