Шифрование электронной почты с помощью GPG.

GPG представляет собой программу с открытым исходным кодом для шифрования с открытым ключом. Она основана на PGP, но, поскольку последняя является коммерческой с множеством патентов, то лучше использовать GPG.

В этой статье я покажу, как можно работать с этой программой на PHP. Сначала приведу код, а потом пояснения.

<?php

$message = escapeshellarg($message);
$gpg_path = '/usr/local/bin/gpg';
$sender = '
user@mailserver.com Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
';
$rcpt = '
to@someserver.com Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
';
$home = '/home/user';
$user_env = 'user';

$cmd = "echo $msg | HOME=$home USER=$user_env $gpg_path " .
'--quit --no-secmem-warning --encrypt --sing --armor ' .
"--recipient $rcpt --local-user $sender";

$message = '$cmd';

mail($rcpt, 'GPG Mailer', $message);

?>

Вобщем-то, ничего сложного. Здесь может показаться непонятным только опции для GPG. Сейчас разложу всё по полочкам.

С начала мы вызываем программу GPG, расположенную в /usr/local/bin/gpg для шифрования сообщения из $message. Она использует закрытый ключ, который принадлежит Вам ($sender), и открытый ключ, принадлежащий $rcpt. Теперь только он сможет расшифровать Ваше сообщение.

Установка переменных окружение HOME и USER указывает GPG, где ей нужно искать свои настройки шифрования ($HOME/.gnupg/secring.gpg). Параметры --quiet и --no-secmem-warning подавляют предупреждения GPG, которые в противном случае были бы сгенерированы и добавились к тесту сообщения. Параметры --encrypt и --sing заставляют GPG зашифровать сообщение и подписать его. Шифрование сообщение закрывает его от любого, кроме адресата. В подписи содержится информация о том, кто составил сообщение и когда. Параметр --armor генерирует простой текст вместо двоичного кода, для более удобной рассылки.

Обычно закрытые ключи защищаются с помощью идентификационной фразы. Если взломщик скопирует закрытый ключ, защищенный идентификационной фразой, то он ничего не сможет сделать с письмом, т.к. GPG запрашивает её при расшифровке. В этом коде эта фраза не используется.