Шифрование сообщений с помощью Pidgin-paranoia
Вступление
Плагин позволяет использовать одноразовый блокнот для общения с помощью менеджера мгновенных сообщений Pidgin с использованием информационно-теоретически стойкого шифрования.
Алиса создает файл с ключевым материалом (гаммой), а также его копию, побайтово переписанную в обратном направлении с конца в начало, которую передает Бобу безопасным способом. Оба респондента – Алиса и Боб – используют первую половину своего ключевого файла для зашифровывания, а вторую для расшифровывания сообщений, посылаемых друг другу.
Каждое сообщение зашифровывается и расшифровывается имплементацией случайных байтов ключевого матерала в сообщение операцией XOR. Зашифрованное сообщение далее перекодируется в Base64 и отправлется адресату совместно с информацией о том, какой байт ключевого материала был использован как первый в процессе зашифровывания сообщения.
Плагин написан на языке С под GPL (version 3).
Плагин следует своей целью предоставление "совершенной" безопасности с помощью наиболее простой для понимания системы шифрования.
Безопасность одноразового блокнота
Криптосистема является информационно-теоретически стойкой, если шифртекст (и алгоритм шифрования) не дает противнику достаточной информации для открытия исходного открытого текста. Если в протоколе шифрования с помощью одноразового болнота используется ключевой материал одинаковой длины с открытым текстом, тогда шифртекст соответстующей длинны расшифроваывется с любой открытый текст, сделано ли это с помощью подходяще подобранного ключевого материала. Используется ли только действительно случайный ключевой материал и только один раз, перехват шифрованного сообщения не дает противнику никакой информации о исходном открытом тексте (за исключением длины сообщения в некоторых вариантах протокола одноразового блокнота).
Другие криптосистемы, использующие симметрическое или асимметрическое шифрование, являются стойкими вычислительно, но не информационно-теоретически. Это означает, что противник обладает информацией, теоретически достаточной для получения исходного открытого текста, но практически ограничен временем, необходимым для производства соответствующих вычислений. Более быстрые компютеры, лучшие алгоритмы или, возможно, кватновые компютеры могли бы взломать такие криптосистемы.
Описание протокола шифрования, внедренного в библиотеку libotp
Этот параграф описывает библиотеку libotp. Конкретные детали зависят от аппликации, в которую она имплементирована.
Файл ключевого матерала
Алиса создает файл с ключевым материалом, состоящий из совершенно случайных чисел (очень непростая задача) размером, скажем, 1 МВ. Далее, она генерирует идентификационный номер ID в форме восьмиместного шестнадцатиричного числа, например, 34EF4588. Это число нельзя получать из ключевого материала, потому что это может ослабить криптосистему (хотя бы в теории)! Алиса дает созданному файлу ключевого материала название "alice@jabber.org bob@jabber.org 34EF4588.entropy" и создает его побайтово перевернутую копию с названием "bob@jabber.org alice@jabber.org 34EF4588.entropy".
Из названия ключевого файла "alice@jabber.org bob@jabber.org 34EF4588.entropy" следует, что Алиса будет использовать его для общения с Бобом.
Ключевой файл Боба с названием "bob@jabber.org alice@jabber.org 34EF4588.entropy" Алиса передает Бобу безопасным путем, например на компактном диске. Его ключевой файл Алисе больше ненужен и она может удалить его (прим. переводчика: она ОБЯЗАНА удалить его).
Теперь, оба респондента используют первую половину своего файла ключевого материала для зашифровки отправляемого сообщения, а вторую половину для расшифровки полученнного.
Зашифровка сообщения
Алиса находит первый байт не равный \0 в своем файле ключевого материала. Далее, она последовательно берет один байт из ключевого материала для каждого одного байта сообщения и составляет шифрованное сообщение с помощью операции XOR. Вместо использованного байта Алиса записывает на его место \0 в ключевой материал. Это обеспечивает только одноразовое использование любой части ключевого материала и, тем самым, безопасность зашифрованного сообщения! Зашифрованное сообщение, далее, перекодируется в Base64 (например, "M+Rla2w="), что обеспечивает компатибильность с различными транспортными уровнями.
Строка вида "3234|34EF4588|M+Rla2w=" отправляется адресату. В этой строке:
- 3234 – исходная позиция (в десятичной системе), с которой Алиса начала использовать свой ключевой материал
- 34EF4588 – ID для контроля, доступен ли обоим респондентам одинаковый файл ключевого материала
- M+Rla2w= – шифрованное сообщение в кодировке Base64.
Чтобы противник не узнал длину сообщения, в его конец добавляется случайной длины окончание, состоящее из \0. Контрольная сумма сообщения CRC32 записывается в это окончание на позиции 1-4 (4 bytes unsigned integer, little endian) для подтверждения его целостности (которая может быть нарушена противником или по другим причинам, например, урезанием длинных сообщений некоторыми сервисами). Пользователь получает предупреждение, если контрольная сумма некорректна.
Расшифровка сообщения
Боб раскодировывает полученное сообщение обратно из Base64 и расшифровывает его с помощью своего ключевого материала. Расшифровку он начинает с использованием номера начального байта, указанного в начале сообщения, используя и отсчитывая байты в обратном направлении с конца в начало файла ключевого матераиала.
Описание плагина с одноразовым блокнотом для Pidgin
Этот параграф описывает плагин для Pidgin, использующий библиотеку libotp.
Управление ключевым материалом и сессией
Старт плагина вызывает поиск доступных файлов ключевого материала. Полученные данные сохраняются в линкованном списке, содержащем собственно сами одноразовые блокноты (libotp.h) и настройки (paranoia.c) (The data is stord in a linked list containing an otp (libotp.h) and an options (paranoia.c) struct.). При отправлении или получении сообщения, плагин ищет в списке указание на соответствующий файл ключевого материала.
Инициализация
С началом корреспонденции, если доступен хотя бы один файл ключевого материала, плагин отсылает адресату специальное сообщение:
*** Request for conversation with the Pidgin-Paranoia plugin ($(comma separated IDs)) I'm paranoid, please download the One-Time Pad plugin for encrypted communication.
Если у получаетеля установлен такой же плагин и имеется соответствующий файл ключевого материала, не будет отображено только это сообщение. Вместо того плагин автоматически отошлет зашифрованный ответ (acknowledge message). Если плагин может расшифровать это сообщение, он активизирует функцию шифрования для данного ID. Все последующие сообщения зашифровываются автоматически и имеют форму:
*** Encrypted with the Pidgin-Paranoia plugin: + зашифрованное сообщение.
Если один из респондентов отключается, сессия прерывается. Для продолжения общения необходима инициализация новой сессии.
Если отправитель отошлет сообщение открытым текстом, плагин прекратит зашифровывание сообщений.
Генерирование ключевого материала
Данный параграф описывает процедуру генерирования ключевого материала и возможные опции. Новый файл ключевого материала генерирутеся коммандой /otp genkey <size> <source>, введенной прямо в окне чата. Если источник энтропии не указан, ключевой материал генерируется с помощью встроенного генератора ключевого материала (the key is generated with the internal key generator). Кроме того, источником может быть отдельный файл, содержащий энтропию, или знаковое устройство (character device).
Встроенный генератор ключевого материала
Встроенный генератор ключевого материала получает энтропию из разных источников и смешивает ее в один пул. После двукратного заполнения пула, его содержание записывается в файл ключевого материала. В настоящее время используются четыре источника энтропии:
- audio device – Entropy is taken from the /dev/audio device and antibiased with the improved newman algorithm to improve the quality of the entropy
- /dev/random –
- thread timing – the time to generate and finish 100 Threads is measured and mixed into the entropy pool
- /dev/urandom – для повышения скорости некоторое количество энтропии добавляется в пул с этого устройства
Получение ключевого материала из файла, содежращего энтропию
Файл, являющийся источником для генерирования ключевого материала, должен быть обычнфм неформатированным файлом энтропии (standart unformated file with entropy). Пользователь несет полную ответственность за качество энтропии, содержадейся в файле-источнике. Этот файл должен быть достаточной длинны, иначе файл ключевого материала небудет сгенерирован.
Получение ключевого материала из устройства – источника энтропии
В качестве источника энтропии может быть использовано знаковое устройство (character device). Качество энтропии, получаемое из этого источника, не контроллируется встроенным генератором, поэтому пользователь несет полную ответственность за ее качество. Время, необходимое для генерирования ключевого материала, зависит от свойств используемого источника.
Управление плагином и первоначальная настройка
(Перевод текста этого параграфа добавлен переводчиком из другого источника для пущей полноты.)
Управление
Для загрузки плагина выберите последовательно в настройках плагинов
Tools -> Plugins -> One-Time Pad encryption
Команды управления плагином задаются в прямо в окне чата и начинаются всегда префиксом /otp.
Действие команд зависит от конкретной сессии. Например команда /otp genkey 100 создает пару файлов ключевого материала для двух аккаунтов, задействованных в данной сессии.
Файл подсказки
Подсказка вызывается командой /otp help.
- /otp help – вызов данной подсказки
- /otp genkey <size> <external entropy source> – генерирование пары файлов ключевого материала размером <size> kiB
- /otp on – попытка включения шифрования
- /otp off – выключение шифрования
- /otp info – отображение деталей используемого файла ключевого материала
- /otp list – отображение всех ключей для данной сессии общения
- /otp list-all – отображение всех имеющихся файлов ключевого материала
- /otp reload – перезагрузка всех собственных файлов ключевого материала
Первоначальная настройка
- Сгенерируйте пару файлов ключевого материала для себя и своего параноидного друга командой, например, /otp genkey 100. Процесс займет некоторое время.
- Ваш файл ключевого материала сохранен в /.paranoia. Файл вашего друга – на вашем рабочем столе. Передайте своему другу его ключ безопасным способом, например на флешке.
- Ваш друг поместит свой файл ключевого материала, который вы для него создали, в свою директорию /.paranoia.
- Он должен выполнить команду /otp reload, чтобы придать новый ключ в свой список.
- Чат зашифрован!