Использование OpenSSL в PHP

К моему большому удивлению, openssl-функции оказались одними из самых плохо документированных из тех что мне приходилось использовать в PHP. Это тем более удивительно учитывая огромное количество возможностей самой библиотеки OpenSSL. Поэтому решил записать несколько основых моментов. Рассмотрим пример ассиметричного шифрования с помощью OpenSSL.

Создание пары приватного и публичного ключей

Генерация приватного 1024-битного ключа: openssl genrsa -out private.pem 1024

Создание парного публичного ключа: openssl rsa -pubout -in private.pem -out public.pem

Шифрование

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

Подпись

Для подтверждения того что зашифрованное сообщение пришло из даверенного источника используется подпись. Но в этом случае ключи используются наоборот - приватным ключом создаётся подпись, а публичным эта подпись проверяется. Таким образом для защищённого обмена сообщениями обе стороны должны обменяться своими публичными ключами. Для создания подписи используется функция opensslsign, а для проверки opensslverify.