Контрольный список удалённый обмен ключами

https://consp11.github.io
Нужное ПО
OpenSSL (в Linux уже есть)
VeraCrypt или другое ПО для создания ключевых файлов
Программа для симметричного шифрования
Программа стеганографирования 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 собеседнику по любому каналу связи (можно через социальную сеть или другому открытому каналу). Используйте наименее защищённый канал связи.


6) Оба вычислите 512 битный хеш sha3 файла images.jpg .
openssl dgst -out W:\images.jpg.txt -sha3-512 W:\images.jpg

Хеш будет сохранён в файле W:\images.jpg.txt

Либо вычислите его позже, во время сверки хешей.


7) Дождитесь звонка собеседника по телефону или контакта через более защищённый канал связи (например, bitmessenger)


8) Сверьте хеши по защищённому каналу связи. Они должны совпадать побуквенно (регистр символов значения не имеет: заглавные и строчные буквы идентичны).
Например,

Если хеши не равны, значит что-то не так. Посмотрите, те ли файлы вы захешировали.


9) Создайте одноразовую записку на сервисе privnote.com.
Запишите в ней пароли от стеганографированного файла.
Убедитесь, что она будет автоматически уничтожена после прочтения (настройки по умолчанию при создании).


10) Отдайте url записки по более защищённому каналу связи.


11) Собеседник должен указать, что успешно расшифровал (расстеганографировал) программой OpenPuff сообщение (ключ). То есть расшифровал images.jpg в key.pub .
Больше пока защищённый канал связи не нужен.
Расшифрование производится на логический диск в оперативной памяти.



5. Собеседник продолжает согласование ключей.

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.


Рецензии