На главную
Удалённый обмен ключами
Контрольный список: удалённый обмен ключами
Нужное ПО
OpenSSL (в Linux уже есть)
VeraCrypt или другое ПО для создания ключевых файлов
Программа для симметричного шифрования (любая, например, OpenSSL)
Программа стеганографирования OpenPuff
Любые картинки формата jpg (для стеганографирования)
0. Перед согласованием ключей подумайте, нужны ли мероприятия по выявлению того, что собеседник под контролем. Если да, создайте план таких мероприятий и согласуйте его с собеседником.
Также подумайте, достаточно ли того, что согласование осуществляется по сети, без личной встречи.
Возможно, лучше стоит встретиться?
В данном списке мы исходим из предположения, что квантовый компьютер, способный расшифровать 16384 битный ключ RSA не будет создан ещё долго. Помните, что за тяжкие преступления срок давности 10 лет, за особо тяжкие - 15 лет, за терроризм и преступления, наказываемые пожизненным лишением свободы, - вообще без сроков давности.
А за некоторые вещи могут мстить даже после вашей смерти.
Поэтому, если речь идёт о серьёзных вещах, стоит встретиться лично, а не передавать ключи по сети.
1. Создать логический диск в оперативной памяти без отображения на образ на жёстком диске.
Объёма 2 Мб должно хватить на всё с большим запасом.
Далее "W:" - логический диск в оперативной памяти (буква значения не имеет, подставьте свою).
Убедится, что файл подкачки (swap-файл) на вашем компьютере отключён.
2.Открываем cmd.exe (под Windows) или терминал под Linux (ctrl+alt+T под Ubuntu).
1) Ввести команду
openssl version
Если выдалась информация о версии, то всё в порядке (аналогично "OpenSSL 1.1.1d 10 Sep 2019"). Обратите внимание на дату. Оно не должно быть слишком старым.
2) Если нет, использовать команду cd для движения в нужную директорию.
Примеры:
cd /
cd ..
cd openssl/bin
3. Если нет нужды использовать уже готовый открытый ключ, создать новый ключевой файл RSA.
1) Создать файл, содержащий случайные данные. Далее обозначается как W:\rnd
В VeraCrypt Сервис -> Генератор ключевых файлов . Размер 2048 байта (это 16384 бита).
2) Сгенерировать нешифрованный ключ RSA (пару ключей RSA, длиною 16384 битов)
openssl genrsa -rand W:\rnd -out W:\key.priv 16384
Никому не передавайте W:\key.priv . Это секретный ключ.
Зашифруйте файл (любой программой) и сохраните, чтобы не потерять (можно в облаке).
Либо сгенерировать шифрованный ключ RSA
openssl genrsa -rand W:\rnd -out W:\key.priv -aes-256-cbc 16384
Пароль введите с консоли после генерации (по запросу программы). Убедитесь, что в пароле нет русских символов - иначе могут быть проблемы.
3) Извлечь публичный ключ RSA в отдельный файл.
openssl rsa -in W:\key.priv -out W:\key.pub -pubout -check
Создайте его копию и сохраните её.
Если ключ создан специально для этого человека, возможно, эту копию тоже стоит зашифровать и хранить в секрете. В противном случае, этот файл можно публиковать.
4) Проверьте, что W:\key.pub в разы меньше (по размеру файла), чем W:\key.priv по размеру файла (например, 3 кб и 13 кб).
Если нет, ищите ошибку. Проверьте, что выше вы вводили параметр "-pubout".
4. Начните согласование ключей.
1) Дайте собеседнику ссылку на процесс согласования или другим способом, желательно, по отдельному каналу связи, предупредите собеседника, что вы будете согласовывать ключи.
2) Подберите картинку для стеганографирования. Допустим, image.jpg .
3) Сгенерируйте пароль (или три пароля для стеганографии) и сохраните их где-либо (в менеджере паролей, например).
4) Застеганографируйте программой OpenPuff в файле image.jpg файл key.pub .
Новая картинка, пусть будет images.jpg (выберите ваше название и подставьте ниже его)
Стеганография не обязательна, но желательна.
Обратите также внимание на то, что если вы ранее вступали с этим человеком в шифрованную переписку, то нужно зашифровать также этот файл имеющимся симметричным ключом (если он был симметричным) для дополнительной защиты.
5) Отошлите images.jpg собеседнику по любому каналу связи (можно через социальную сеть или другому открытому каналу).
Для отсылки незастеганографированного ключа можно использовать и сервис privnote. В таком случае, нужно преобразовать ключевой файл в base64. Под Linux это делается командой base64, но подробно это здесь освещать не будем.
6) Оба вычислите 512 битный хеш sha3 файла images.jpg . (без стеганографии, просто вычислите хеш ключевого файла)
openssl dgst -out W:\images.jpg.txt -sha3-512 W:\images.jpg
Хеш будет сохранён в файле W:\images.jpg.txt
Либо вычислите его позже, во время сверки хешей.
7) Дождитесь звонка собеседника по телефону или контакта через более защищённый канал связи (например, bitmessenger). В данном случае, стоит использовать канал, где вы можете хоть как-то проверить, что беседуете именно с тем, кому хотели передать ключ.
Помните, что использование телефона отслеживается государственными структурами, если для вас это важно (не используйте телефон в таком случае).
8) Сверьте хеши по защищённому каналу связи. Они должны совпадать побуквенно (регистр символов значения не имеет: заглавные и строчные буквы идентичны).
Например, "ef3ec952a67997dedbb93807ba00f319b140b7a3444c0be061b3b7bf77457c6c676e0b4fcf94cdd4ebe1d4162ece2e824c2438dd4d0f7ad6a1d7ef260bb2653f".
Если хеши не равны, значит что-то не так. Посмотрите, те ли файлы вы захешировали.
9) Создайте одноразовую записку на сервисе privnote.com.
Запишите в ней пароли от стеганографированного файла.
Убедитесь, что она будет автоматически уничтожена после прочтения (настройки по умолчанию при создании).
Если вы уже выше использовали этот сервис для передачи ключевого файла, тогда используйте другой сервис одноразовых записок для передачи пароля.
10) Отдайте url записки по более защищённому каналу связи. url можно отдельно обфусцировать сервисом одноразовых ссылок.
11) Собеседник должен указать, что успешно расшифровал (расстеганографировал) программой OpenPuff сообщение (ключ). То есть расшифровал images.jpg в key.pub .
Больше пока защищённый канал связи не нужен.
Расшифрование производится на логический диск в оперативной памяти.
5. Собеседник продолжает согласование ключей.
Теперь наша задача согласовать с помощью rsa-ключа ключ симметричного шифрования.
1) Собеседник генерирует случайный файл sym.key программой VeraCrypt (Сервис -> Генератор ключевых файлов) или иной криптографической программой генерации. Генерация на логический диск в оперативной памяти.
2) Собеседник должен зашифровать sym.key публичным ключом key.pub
openssl rsautl -inkey W:\key.pub -pubin -encrypt -oaep -in W:\sym.key -out W:\sym.key.rsa
3) Зашифровать полученный файл sym.key.rsa любой программой симметричного шифрования. В том числе, MultiObfuscator или openssl. Шифрованный файл sym.key.rsa.crypted
4) Собеседник передаёт файл sym.key.rsa.crypted по любому каналу связи. (если нужно, его тоже можно стеганографировать)
5) Дождаться подтверждения получения файла sym.key.rsa.crypted. Хеши можно не проверять.
6) Собеседник сохраняет пароль симметричного шифрования в одноразовых записках privnote.com.
7) Собеседник передаёт по более защищённому каналу связи url записки с паролем симметричного шифрования файла sym.key.rsa.crypted.
Убедитесь, что она будет автоматически уничтожена после прочтения (настройки по умолчанию при создании).
8) Расшифруйте sym.key.rsa.crypted с помощью переданных паролей на логический диск в оперативной памяти. sym.key.rsa - расшифрованный файл.
9) Расшифровать sym.key.rsa асимметричным алгоритмом RSA.
openssl rsautl -inkey W:\key.priv -decrypt -oaep -in W:\sym.key.rsa -out W:\sym.key
10) Зашифровать W:\sym.key любой программой симметричного шифрования для последующего использования.
6. Использовать sym.key в расшифрованном виде как ключевой файл для любой программы симметричного шифрования. Либо преобразовать его в парольный файл W:\pwd.txt с помощью команды
openssl base64 -A -in W:\sym.key -out W:\pwd.txt
Использовать те программы, которые это позволяют делать.
До начала отсылки важной информации, провести проверку связи. Если используется OpenSSL, то по пункту 8.
7. Если для симметричного шифрования выбрана OpenSSL, то использовать файл W:\pwd.txt (его можно зашифровать любой программой симметричного шифрования и сохранить, чтобы не получать каждый раз из sym.key).
1) В OpenSSL доступные симметричные шифры можно посмотреть командой
openssl enc -ciphers
2) Зашифруем файл W:\data.txt
openssl enc -e -aes-256-cbc -md sha3-512 -salt -pbkdf2 -iter +1000000 -pass file:W:\pwd.txt -in W:\data.txt -out W:\data.txt.crypted
Обратить внимание, параметр -iter +1000000 должен быть одинаков у всех, вступающих в переписку. Если параметр -iter менялся, отправить информацию о нём вместе с зашифрованным файлом (причём, зашифрованным ещё с предыдущим параметром итераций).
3) Отправим файл W:\data.txt.crypted собеседнику по любому каналу. При желании, можно дополнительно стеганографировать, но уже именно data.txt.crypted.
4) Собеседник расшифровывает командой.
openssl enc -d -aes-256-cbc -md sha3-512 -salt -pbkdf2 -iter +1000000 -pass file:W:\pwd.txt -in W:\data.txt.crypted -out W:\data.txt
5) Собеседник подтверждает получение и успешное расшифрование файла.
Если использовалась стеганография, то подтверждение должно подаваться по тому каналу, который допускает подтверждение. Либо в шифрованном файле должен быть указан способ подтверждения успешного получения/расшифрования файла. Например, парольная фраза ("а у нас всё по-прежнему").
8. В идеале, после согласования ключей, но до того, как начался обмен сообщениями, оба собеседника передают друг другу сообщения (любые случайные заранее неизвестные). Затем вычисляют хеши полученных сообщений и передают друг другу для сверки. Если хеши верные, то они сообщают друг другу об этом.
После этого шифрованный канал связи считается установленным.
Это нужно для того, чтобы убедиться, что канал связи действительно установлен (иногда это может дополнительно защитить канал связи).
Случайные значения можно сгенерировать генератором паролей KeePass или с помощью команды OpenSSL
Каждый из собеседников делает примерно одно и то же.
Генерирует случайный файл для проверки связи
openssl rand -out W:\noise 64
Затем шифрует W:\noise ключом sym.key выбранной программой. Например, как это выше указано в пункте 7.
openssl enc -e -aes-256-cbc -md sha3-512 -salt -pbkdf2 -iter +1000000 -pass file:W:\pwd.txt -in W:\noise -out W:\data.crypted
Отсылает собеседнику файл data.crypted. Собеседник расшифровывает файл
openssl enc -d -aes-256-cbc -md sha3-512 -salt -pbkdf2 -iter +1000000 -pass file:W:\pwd.txt -in W:\data.crypted -out W:\data
и вычисляет хеш
openssl dgst -out W:\dgst -sha3-512 W:\data
Шифрует хеш
openssl enc -e -aes-256-cbc -md sha3-512 -salt -pbkdf2 -iter +1000000 -pass file:W:\pwd.txt -in W:\dgst -out W:\dgst.crypted
Отсылает его обратно.
Полученный хеш расшифровывается
openssl enc -d -aes-256-cbc -md sha3-512 -salt -pbkdf2 -iter +1000000 -pass file:W:\pwd.txt -in W:\dgst.crypted -out W:\dgst2
Затем сравнивается два файла dgst и dgst2:
хеш исходного файла
openssl dgst -out W:\dgst -sha3-512 W:\data
и расшифрованный файл хеша dgst2
Если всё в порядке, собеседник шлёт другому собеседнику подтверждение (в шифрованном виде, разумеется).
Собеседник может шифровать важную информацию после того, как направил собеседнику подтверждение.
Надеюсь, что когда вы выполняете эти манипуляции, вы хорошо понимаете все параметры. Они написаны здесь как памятка, но вы должны хорошо понимать, что стоит за этими параметрами и подставлять те имена файлов, которые вам нужны.
Никогда не делайте того, что не понимаете. Спросите у кого-нибудь (если это возможно) и/или почитайте справку. Например, в OpenSSL есть команда
openssl help
Если вы хотите узнать, например, краткую справку по команде rand, наберите
openssl help rand
Более полное описание вы можете найти в интернете или посмотрев страницы man в Linux.
Обмен симметричными ключами.