Схема генерации серийного номера бедного человека
Я хотел бы получить простую схему / алгоритм для генерации серийных номеров на основе уникального аппаратного идентификатора (идентификатор процессора или сетевой адрес Mac или серийный номер жесткого диска).
Я хотел бы, чтобы схема работала только в одном направлении - чтобы приложение на клиентской машине могло проверять серийный номер, но не генерировать его. (Так что было бы не просто взломать).
Теперь, скорее всего, большинство из вас порекомендует какой-то тип шифрования пар открытого и секретного ключей RSA, который может работать достаточно надежно - у клиента нет закрытого ключа RSA, поэтому он не может "генерировать" серийный номер.
Но главная проблема с подписью RSA состоит в том, что она слишком велика - ее размер подписи составляет 128 или 256 байтов в зависимости от размера ключа RSA ( размера подписи RSA?)
- Я хочу, чтобы серийный номер был простым копированием и вставкой из почты в регистрационную форму - максимум 64 символа, в идеале 32 байта.
Хорошо, теперь вы, вероятно, скажете, что такого рода защита недостаточно хороша для взлома методом "грубой силы", когда вы просто пробуете все комбинации, чтобы определить правильный серийный номер.
Но я бы сказал, что обычно вам нужно нанять "дорогого" хакера или команду хакеров, чтобы создать такое приложение для взлома.
Также я думаю, что можно изменить алгоритм генерации серийного номера для следующих версий приложения или использовать многократное прохождение, чтобы резко снизить грубую силу.
В качестве основы я бы предпочел использовать обычный C или C++ (не C#), предпочтительно Windows / wincrypt.h или любой существующий простой исходный код на C (предпочтительно не огромные сторонние библиотеки).
Можно ли создать пару открытых / закрытых ключей RSA, чтобы длина подписи составляла 32 символа?
3 ответа
Вы можете проверить ECDSA.
ECDSA - это алгоритм с открытым ключом, такой как RSA, но с более коротким ключом и размером подписи, чем RSA, для обеспечения того же уровня эффективной безопасности. ECDSA основан на криптографии с эллиптической кривой. Как задача целочисленной факторизации, используемая в RSA, так и эллиптическая кривая, используемая в ECDSA, сводятся к проблеме дискретного логарифма, которая, как полагают, трудно решить.
Например, для уровня безопасности, аналогичного 1024-битному RSA, который, по оценкам, имеет приблизительно 80-битную защиту, вы можете использовать 160-битный ключ ECDSA, который выдает 320-битную подпись. Вы можете base64 кодировать 320-битную подпись в строку из 54 символов или ascii85 кодировать в строку из 50 символов.
В качестве альтернативы, если вы хотите сохранить 32 символа с кодировкой base64, которая может содержать не более 192-битных данных, вы можете использовать ECDSA с 96-битным размером ключа. Эффективная сила 96-битного ECDSA - 48-битная, что, как правило, недостаточно для правильного шифрования, но в вашем случае злоумышленнику все еще может быть проще пересмотреть программу, чтобы удалить проверки вашего лицензионного ключа, чем пытаться создать поддельный ключ.
Вы ищете криптографическую хэш-функцию. Хорошим примером, который вписывается в желаемые 32 символа, будет md5.
Я решил опубликовать свое собственное решение, которое использует предлагаемую на этом форуме пару закрытых / открытых ключей ECDSA и включает в себя использование алгоритма двустороннего шифрования, о котором я спрашивал здесь: Схема генерации серийного номера бедного человека, часть 2
Вполне возможно, что в коде все еще есть ошибки, но я старался изо всех сил и тестировал все, что мог.
Он также использует часть управляемого кода и код C# для тестирования кода C++, но в зависимости от вашей реализации может потребоваться полностью исключить управляемые части.
Поскольку размер ответа здесь ограничен, мне пришлось поместить свой код на внешний URL-адрес, поэтому размер ответа будет достаточно мал.
Вот мои фрагменты кода:
Третий код неполон - это всего лишь демонстрационный код, как его можно кодировать. Если вы не используете C#, то верхний уровень может быть чем-то другим.
Для подписания EDSCA algorihtm я использовал https://github.com/esxgx/easy-ecc с небольшим исправлением - чтобы сократить размер подписи:
/* Curve selection options. */
#define secp128r1 16
#ifndef ECC_CURVE
#define ECC_CURVE secp128r1
#endif
- настолько маленький возможный размер подписи.
И теперь, когда вы начнете проверять код, вы заметите, что пары открытого и закрытого ключей не инициализированы, поскольку они тесно связаны с моим продуктом. Но позвольте мне опубликовать здесь демо-ключ (я использовал текущий код для их инициализации)
unsigned char publicKey[] = {
0x03, 0x7A, 0x0E, 0xE4, 0x2C, 0xC1, 0x29, 0x1D, 0x22, 0xCF, 0x6F, 0xCE, 0x03, 0x5F, 0xBF, 0x31, 0xDD,
};
unsigned char encryptedPrivateKey[] = {
0x9E, 0x8C, 0x4C, 0x8F, 0x02, 0x1D, 0x7E, 0x34, 0xA0, 0xDB, 0xBC, 0x45, 0xD8, 0x1A, 0x57, 0x7A,
};
Таким образом, с текущей парой открытого / закрытого ключа - для идентификатора оборудования 000000000000 (полученного из MAC-адреса сетевой карты) - действителен следующий серийный ключ:
pc000000000000-NnE84PSfl8nFxmhpHn+gvNFwZNkwuEFKAzu/yEmDohc=
Теперь он содержит подписанную часть ("pc000000000000") и саму подпись ("NnE84PSfl8nFxmhpHn+gvNFwZNkwuEFKAzu/yEmDohc=").
Самое приятное, что теперь у вас есть полный исходный код моего решения, включая открытый и закрытый ключи. Чего не хватает, так это пароля, который я использовал для шифрования секретного ключа администратора, но без него вы не сможете сгенерировать серийные номера. Теперь я предлагаю хакерам взломать это решение - создать генератор последовательного ключа для моего программного обеспечения. Довольно интересная дилемма - у вас есть полный исходный код, но он бесполезен для вас.:-)
Я думаю, что программное обеспечение для взлома все еще возможно (прыжок Асма без операции), но это то, что всегда можно выполнить.
Цель состоит в том, чтобы сделать жизнь хакера немного сложнее, представив простое, маленькое и красивое решение для генерации последовательного ключа - решение, которое можно просто скопировать и вставить из одного продукта в другой.