Zend_Crypt_DiffieHellman - пример использования - PullRequest
3 голосов
/ 07 февраля 2012

Есть ли пример использования класса Zend_Crypt_DiffieHellman? Я пытаюсь написать настольное приложение, которое будет безопасно взаимодействовать с PHP-сервером на Zend Framework. Я застрял с пониманием, как я могу установить общий ключ между двумя сторонами. Нужно ли мне получать набор моих собственных простых чисел?

Любой пример использования этого для получения общего ключа был бы очень признателен!

Я думаю, что мой настоящий вопрос - как получить простое число и генератор для него!

1 Ответ

4 голосов
/ 08 февраля 2012

Как получить группу (состоящую из простого числа и генератора)

Я ни в коем случае не эксперт по криптографии, но я думаю, что вы должны использовать "Хорошо известные группы""определено в RFC 2412 - Протокол определения ключа OAKLEY (приложение E.1) или группы из RFC 3526 .Вам, вероятно, придется сначала преобразовать шестнадцатеричные числа в десятичные, прежде чем использовать их с Zend_Crypt_DiffieHellman.

Какую группу следует использовать?

Чем больше, тем лучше - нет, просто шутите.

Зависит от того, как вы планируете осуществить обмен ключами.Если вам нужно выполнить DH-обмен для каждого HTTP-запроса, большая группа убьет ваш сервер, потому что это займет больше времени для вычислений (но с другой стороны сложнее взломать).В моем примере я использовал «Хорошо известную группу 1» с 768 битами, и она была довольно медленной (хорошо, моя машина разработки не самая быстрая).

Вы также можете добавить опцию, что сервер ина первом шаге клиент соглашается, какую предварительно определенную группу использовать.Например: Вы доставляете хорошо известные группы 1, 2 и 5 вместе со своим заявлением.И до фактического обмена ключами DH ваши стороны договариваются об использовании группы 1 для фактического обмена ключами DH.Таким образом, вы можете переключиться на большие группы, когда оборудование догоняет.Конечно, это групповое соглашение добавляет еще один шаг к процессу обмена ключами.

Zend_Crypt_DiffieHellman пример

Это простой пример, фактически не передающий общедоступные данные другому процессу.

// why disable the use of openssl?
// apparently "computeSecretKey" uses the php function 
// openssl_dh_compute_key which expects an openssl "pkey" resource but
// the Zend Framework (1.11.4) supplies a string
Zend_Crypt_DiffieHellman::$useOpenssl = false;

// here I define the Well Known Group 1 (which consists of the prime and
// the generator) with a 768 bit prime. 
// These can be either hard coded ore your parties agree on which group to
// use in a separate step of the key-exchange process.
$public_prime =
    "155251809230070893513091813125848175563133404943451431320235" .
    "119490296623994910210725866945387659164244291000768028886422" .
    "915080371891804634263272761303128298374438082089019628850917" .
    "0691316593175367469551763119843371637221007210577919";
$public_generator = 2;

// if you want it to go fast use smaller values (these are from the
// Diffie Hellman entry on Wikipedia).
//$public_generator = 5;
//$public_prime = 23;

$bob = new Zend_Crypt_DiffieHellman($public_prime, $public_generator);
$alice = new Zend_Crypt_DiffieHellman($public_prime, $public_generator);

// first generate the private key and the public data on both sides
$bob->generateKeys();
$alice->generateKeys();

// you can access the public data using the "getPublicKey" method.
// You can transmit those values over the wire to the other party. 
echo "bob=", $bob->getPublicKey(), PHP_EOL;
echo "alice=", $alice->getPublicKey(), PHP_EOL;

// After both parties have received the public data from the other party
// they can calculate the shared secret:    
echo "shared(alice)=", $alice->computeSecretKey($bob->getPublicKey()), PHP_EOL;
echo "shared(bob  )=", $bob->computeSecretKey($alice->getPublicKey()), PHP_EOL;
// the values should be equal.

Единственное, что действительно передается по проводам, это возвращаемое значение Zend_Crypt_DiffieHellman::getPublicKey.Публичные данные могут быть закодированы в виде текста (Zend_Crypt_DiffieHellman::NUMBER) или в виде двоичных данных (Zend_Crypt_DiffieHellman::BINARY).

Существует еще одно: Zend_Crypt_DiffieHellman::BTWOC, такое же, как двоичные, но с начальным нулевым байтом,таким образом, целое число не рассматривается как «подписанное» целое число - если ваше клиентское приложение использует Java JCE или .NET Crypto API, это, вероятно, лучше всего подходит для двоичной передачи.

Незатребованный совет

Если вы хотите облегчить свою жизнь, не изобретайте заново SSL - просто используйте существующую реализацию SSL через HTTPS.

Большинство библиотек SSL позволяют проверять сертификат сервера, поэтому проверьте действительность сертификата сервера на клиенте (по крайней мере, проверьте отпечаток пальца).

А если вам нужно или хотите, вы можете проверить сертификат клиента на сервере (см. Использование клиентских сертификатов SSL с PHP ).

...