Максим Левин - PGP: Кодирование и шифрование информации с открытым ключом.
Помните, что созданный файл, exam.pgp, не является ASCII файлом, поэтому для отправки его по e-mail может потребоваться добавить еще одну опцию -а для того, чтобы выходной закодированный файл был в формате ASCII, например так:
pgp -еа exam.doc marcos
По причинам безопасности, нам иногда может потребоваться удалить оригинал. PGP может делать это автоматически при помощи опции -w:
pgp –eaw exam.doc marcos
Кодирование сообщения для нескольких получателей
Теперь представьте, что наш учитель хочет послать эти задачи своим коллегам по кафедре. Чтобы это сделать, ему необходимо просто набрать вместо одного несколько идентификаторов:
pgp –ea exam.doc marcos juan alicia
Заметьте, что опция -а тоже используется, поэтому выходной файл будет в формате ASCII и его можно будет послать по e-mail.
Как сообщение подписывается.
Как уже говорилось, цифровая подпись в сообщении является аналогом обычной подписи на бумаге. Подпись документа позволит получателю удостовериться в его аутентичности и в том, что сообщение не было изменено.
Чтобы подписать документ, необходимо использовать ваш закрытый ключ:
pgp -s файл [-u идентификатор]
Если у нас есть несколько закрытых ключей в нашем secring.pgp, мы можем выбрать один из них при помощи идентификатора.
Когда наш учитель из примера решает подписать экзаменационные задачи, чтобы сообщить, что их послали не студенты-шутники :) он набирает следующее:
pgp –s exam.doc
Эта команда создает файл с именем exam.doc.pgp, который не является ASCII-текстом, потому что PGP пытается сжать файл. Если, с другой стороны, вы хотите подписать файл, оставив текст читабельным и с подписью в конце, то процедура будет выглядеть:
pgp -sta exam.doc
Эта последняя команда очень полезна при подписи электронной почты, которую и дальше можно будет читать без использования PGP или тем, кому не хочется проверять подпись.
Кроме того, можно подписать документ и затем закодировать его при помощи следующей команды:
pgp -es файл идентификатор_получателя [-u мой_идентификатор]
Например:
pgp -es exam.doc marcos –u angel
Здесь файл exam.doc кодируется и подписывается и сохраняется в файле exam.pgp. Для кодирования файла используется открытый ключ, идентифицируемый подстрокой "marcos", поэтому только этим ключом можно декодировать этот файл. Затем я идентифицирую мой закрытый ключ строкой "angel", так как в моем кольце есть несколько ключей.
Даже в этом случае можно создать файл в формате ASCII, используя опцию -a.
Кроме того, нас может заинтересовать возможность создания подписи файла отдельно от данных. Чтобы это сделать, воспользуемся опцией -b:
pgp -sb exam.doc
Эта команда создает новый файл exam.sig, содержащий только подписи.
Декодирование.
Для декодирования файла и/или проверки его подписи используется команда:
pgp входной_файл [-o выходной_файл]
По умолчанию предполагается, что входной файл имеет расширение .pgp. Выходной файл является необязательным параметром и будет содержать декодированный файл. Если выходной файл не указан, декодированный файл будет сохранен в файле входной_файл без расширения .pgp.
Однако, после декодирования файла нам необходимо указать стандартный выход для декодированного файла. Это достигается использованием опции -m:
pgp -m файл
Существует еще одна возможность — использовать каналы ввода и вывода с опцией -f:
pgp -fs идентификатор < входной_файл > выходной_файл
Еще одним интересным сценарием является декодирование подписанного сообщения, посланного нам кем-нибудь, с сохранением подписи, например для кодирования его еще раз для того, чтобы послать его кому-нибудь еще. Чтобы это сделать, нужно использовать опцию -d:
pgp -d exam
Здесь мы берем файл exam.pgp и декодируем его, но при этом оставляем оригинальную подпись в файле. Теперь можно переходить к кодированию его открытым ключом того человека, который после получения может проверить аутентичность исходного сообщения.
Обработка текстовых файлов.
Часто PGP используется для кодирования электронной почты, которая чаще всего представляет собой текст. Проблема текстовых файлов заключается в том, что на разных машинах текст представляется по-разному; например в MS-DOS все строки заканчиваются символами возврата каретки и перевода строки, в Линуксе только перевод строки, в Macintosh только возврат каретки... и т.д. Чтобы избежать несовместимости платформ, нам необходимо сказать PGP, что мы хотим закодировать текстовый файл, а не бинарный файл, с тем, чтобы после разархивирования его можно было адаптировать к особенностям платформы получателя. Для кодирования текстового файла для e-mail используется опция -t. Например:
pgp -sta текстовый_файл идентификатор
"Отпечатки (fingerprints)".
Отпечаток является последовательностью из 16 бит, которая идентифицирует ключ уникальным образом. Можно проверить, принадлежит ли имеющийся у вас ключ именно тому человеку, сравнив каждый из 16 бит вместо всех 1024 байт, которые составляют ключ.
Для просмотра отпечатка ключа используется команда:
pgp -kvc идентификатор [кольцо]
Использование PGP в командной строке.
PGP имеет опции, которые особенно полезны при использовании PGP в командной строке в автоматизирующих скриптах.
+batchmode
При использовании этой опции PGP не будет спрашивать ничего сверх крайне необходимого. Используйте эту опцию для автоматической проверки подписи. При отсутствии подписи в файле возвращается код ошибки 1; если файл подписан и подпись правильна, то возвращается 0.
pgp +batchmode файл
force
Использование этой опции одобряет любую операцию по переписыванию файла или удалению ключа.
pgp +force –kr marcos
В командной строке желательно обойтись без запросов паролей при кодировании файла. Например, чтобы избежать вопросов во время кодирования мы может просто обойти это, задав переменную окружения PGPPASS.
Здесь приведен пример:
PGPPASS="пароль"
export PGPPASS
pgp –s file.txt marcos
Еще одним способом передачи пароля PGP в неинтерактивном режиме является использование опции -z.
Как здесь:
pgp –sta exams.txt angel -z "пароль"
Еще одна полезная операция в командной строке — это изменение "разговорчивости" PGP при помощи опции +verbose. Она задает тихий режим - то есть отсутствие информационных сообщений, только сообщения об ошибках:
pgp file.pgp +verbose=0
Интеграция в почтовые клиенты.
Интеграция PGP в почтовые клиенты для автоматического кодирования, декодирования и подписи проста и почти не зависит от используемого почтового клиента.
В качестве примера я расскажу про интеграцию PGP в Pine. Надеюсь, читатель использует именно этот почтовый клиент.
Хотя я буду описывать работу PGP с Pine, основные принципы применимы ко всем другим клиентам. Конфигурация, конечно, будет отличаться для каждой почтовой программы.
Для автоматической декодировки почты перед чтением необходим фильтр для обработки сообщения и вывода его на экран. Кроме этого, можно создать макрос, который объединит декодирование и вывод на экран.
В случае Pine, у него есть опция для определения фильтров, которые выполняются до вывода сообщения на экран. Эта опция называется "display-filters" и находится в конфигурационном меню Pine. В эту опцию мы добавим новый фильтр, который выглядит так:
_BEGINNING("------BEGIN PGP MESSAGE------")
_ /usr/local/bin/pgp
Каждое закодированное PGP сообщение заключается двумя определенными строчками - "------ BEGIN PGP MESSAGE ------" и "------ END PGP MESSAGE ------" – с тем, чтобы если вы захотите узнать, имеет ли сообщение в теле закодированный текст, то достаточно найти одну из указанных выше строчек. Фильтр, определенный в Pine, делает именно это. Перед отображением самого сообщения он проверяет тело сообщения на наличие
строки "------ BEGIN PGP MESSAGE ------" с тем лишь ограничением, что она должна быть в начале какой-либо строки. Если он находит ее, он выполняет программу: /usr/local/bin/pgp
Затем, если в теле действительно есть закодированное сообщение, будет выполнено декодирование PGP. У вас спросят пароль и вы сможете прочитать сообщение. Если вы хотите еще больше автоматизировать этот процесс, уменьшив время, необходимое на то, чтобы каждый раз указывать пароль, то вам потребуется определить переменную среды PGPPASS или использовать опцию -z как было показано выше.
Теперь нам требуется только задать фильтр, который закодирует наше сообщение с открытыми ключами получателей из нашего открытого кольца до отправки сообщения.
Pine помогает нам еще раз, в нем есть конфигурационная опция "sending-filters". Ниже приведен фильтр, который надо задать для этой опции:
/usr/local/bin/pgp -etaf_RECIPIENTS
После написания сообщения и нажатия CTRL-Х для отправки, Pine спросит нас, хотим ли мы послать его сразу, без применения заданных фильтров. Чтобы послать сообщение без кодирования, просто ответьте утвердительно, но если вы хотите послать сообщение закодированным, то нажмите CTRL-N или CTRL-Р, далее вам предложат список всех заданных фильтров. В нашем случае это будет только фильтр PGP, приведенный выше.