# Генераторы ключей: UNIX-версия

### Описание

UNIX-версия генератора ключей преставляет собой PHP-файл, содержащий все необходимое для генерации серийных номеров. Файл находится в каталоге Keygen\PHP, ниже рассмотрены основные моменты его использования.

### Настройка генератора

В самом начале PHP-файла располагается код настройки генератора:

    //////////////////////////////////////////////////////////////////////////////////////////////
    // The following lines should be generated by VMProtect License Manager
    $exported_algorithm = "RSA";
    $exported_bits = 2048;
    $exported_private = "PJvj4kEpoQMIpYK+9wEt......xKeiSZgzdiln8Q==";
    $exported_modulus = "rOlny/3QgZb/VmGr3CmY......I6ESAUmtQ+RBqQ==";
    $exported_product_code = "oLQdGUn8kVk=";
    //////////////////////////////////////////////////////////////////////////////////////////////

Этот код генерируется автоматически в VMProtect (см. Экспорт параметров продукта) и уникален для каждого конкретного продукта. Очень важно скопировать его без ошибок, в противном случае генератор будет работать некорректно.

Содержимое ключа

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

    $params = array(
            user_name => "John Doe", // UTF-8!
            email => "john@doe.com",
            hwid => "vHGMdMRvGCPjWcCQ", // Exactly as returned by VMProtectGetCurrentHWID
            expire_date => array(year => 2009, month => 10, day => 1),
            maxbuild_date => array(year => 2009, month => 10, day => 1),
            time_limit => 10,
            user_data => base64_decode("CGCvRvMWcPHGdMjQ"), // string of bytes
            );

### Функция обработки успешной генерации

Ниже расположена простейшая реализация функции, которая вызывается при успешной генерации серийного номера. Единственным параметром она получает строку с номером. Функция должна передать номер вызывающей стороне (регистратору), обычно это делается при помощи команды echo. Предварительно строка разбивается на подстроки длиной 75 символов для удобства. Также эта функция может отправлять сгенерированный номер по почте производителю программы или заносить его в базу данных.

    function OnSerialGenerated($serial)
    {
            $serial = wordwrap($serial, 75, "\n", true);
            echo $serial;
    }

### Функция обработки ошибок генерации

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

    function OnSerialGenerationFailed($details)
    {
            echo "You will receive serial number in the next 24 hours"; // message to the customer
    //    mail("support@vendor.com", "Houston, we have a problem", $details); // message to vendor
    }

Причин возникновения ошибки может быть несколько: некорректные параметры алгоритма, некорректные параметры ключа, слишком длинное имя пользователя или e-mail. Слишком длинный серийный номер, который не влезает в количество бит, указанное в алгоритме. Поэтому функция OnSerialGenerationFailed должна отправить производителю максимально подробную информацию о случившемся, дабы тот мог вручную сгенерировать серийный номер и отправить его покупателю.

### На что еще следует обратить внимание

Генератор ключей в примерах максимально упрощен. Он не учитывает рекомендации по разработке веб-генераторов, данные здесь. Он не проверяет IP-адрес вызывающей стороны и не анализирует входные параметры. Имейте это в виду, когда будете создавать свой собственный генератор на основе этого.

Имя пользователя и e-mail должны быть переданы в кодировке UTF-8. Уточните у вашего регистратора, в какой кодировке он передает информацию о покупателе и, при необходимости, проведите конвертацию. Неправильная кодировка не приведет к неработоспособности серийного номера, однако номер будет содержать совершенно другое имя пользователя и он может быть удивлен, если вы показываете его, скажем, в окне "О Программе".

Асимметричное шифрование - достаточно сложный в математическом плане процесс. Если он реализован на чистом PHP, без применения сторонних библиотек, то генерация серийного номера может занять десятки секунд. Генератор использует функции gmp_powm, bi_powmod, bcpowod в случае их наличия. Все эти функции имеют разную скорость. Если генерация ключей на вашем хостинге занимает слишком большое время, рекомендуется пообщаться со службой поддержки на предмет подключения описаных выше функций. К примеру, функция gmp_powm работает в десятки раз быстрее функции bcpowmod.

© 2006-2015 Copyright VMProtect Software