Это перевод статьи How to encrypt a big file using OpenSSL and someone’s public key, которую написал Alexei Czeskis.

Ситуация

У вас есть чей-то публичный ключ и вы хотите отправить ему файл безопасно.

Можете безопасно звонить, писать в чате или отправить файлы по электронной почте?

Вы можете свободно отправлять файлы, если ваш чат с собеседником работает через OTR или ваша электронная почта шифруется. Это будет быстрее. Вы можете согласовать симметричный ключ и использовать его для шифрования файлов.

Если вы не можете (или не хотите) так общаться с собеседником, то используйте инструкцию ниже.

Шаг 1: получите публичный ключ

Собеседник должен отправить вам свой публичный ключ в формате .pem. Если у него есть RSA-ключ (например, он использует его для SSH), то он может получить его так:

cd ~/.ssh
openssl rsa -in id_rsa -outform pem > id_rsa.pem
openssl rsa -in id_rsa -pubout -outform pem > id_rsa.pub.pem

Попросите его отправить вам файл id_rsa.pub.pem.

Шаг 2: генерация 256 битного (32 байта) рандомного ключа

openssl rand -base64 32 > key.bin

Шаг 3: шифрование ключа

openssl rsautl -encrypt -inkey id_rsa.pub.pem -pubin -in key.bin -out key.bin.enc

Шаг 4: собственно, шифрование большого файла

openssl enc -aes-256-cbc -salt -in SECRET_FILE -out SECRET_FILE.enc -pass file:./key.bin

Шаг 5: отправка и расшифровка файла

Отправьте .enc файлы собеседнику и попросите расшифровать файл следующим образом.

openssl rsautl -decrypt -inkey id_rsa.pem -in key.bin.enc -out key.bin
openssl enc -d -aes-256-cbc -in SECRET_FILE.enc -out SECRET_FILE -pass file:./key.bin

Примечания

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

Если есть человек посередине, то он/она может заменить открытый ключ вашего собеседника на его/ее собственный и тогда вам кранты. Всегда проверяйте открытый ключ другого человека (проверьте хэш и читайте его друг другу по телефону).