Когда я изначально писал этот ответ, предполагалось, что вопрос касается «автономной» проверки лицензионных ключей. Большинство других ответов касаются онлайновой проверки, с которой значительно проще справиться (большую часть логики можно выполнить на стороне сервера).
При автономной проверке самое сложное - это гарантировать, что вы сможете сгенерировать огромное количество уникальных лицензионных ключей, и при этом поддерживать надежный алгоритм, который нелегко скомпрометировать (например, простую контрольную цифру).
Я не очень хорошо разбираюсь в математике, но меня поразило, что один из способов сделать это - использовать математическую функцию, которая строит график
Построенная линия может иметь (если вы используете достаточно точную частоту) тысячи уникальных точек, поэтому вы можете генерировать ключи, выбирая случайные точки на этом графике и каким-то образом кодируя значения.
В качестве примера, мы построим этот график, выберем четыре точки и закодируем в строку как «0, -500; 100, -300; 200, -100; 100,600»
Мы зашифруем строку с помощью известного и фиксированного ключа (ужасно слабый, но он служит цели), затем преобразуем полученные байты через Base32 для генерации окончательного ключа.
Затем приложение может повернуть этот процесс в обратном направлении (от base32 к действительному числу, расшифровать, декодировать точки), а затем проверить, что каждая из этих точек находится на нашем секретном графике.
Это довольно небольшой объем кода, который позволит генерировать огромное количество уникальных и действительных ключей.
Это, однако, очень много безопасности от неизвестности. Любой, кто потратит время на разборку кода, сможет найти графическую функцию и ключи шифрования, а затем смоделировать генератор ключей, но это, вероятно, весьма полезно для замедления случайного пиратства.