Вы здесь

Шифрование в OpenSSL ключом OpenSSH

Подготовка

Генерация ключей SSH и сохранение их в пару файлов (mykey,mykey.pub)

ssh-keygen -t rsa -b 4096 -f mykey 

Приватные ключи по умолчанию сохраняются в формате PEM PKCS#1. Ключи, созданные в "новом" формате OpenSSH (опция -o) не совместимы с другими криптографическими системами.

Формат PEM можно отличить по строкам

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

в файле приватного ключа. В новом формате они заменены на строки

-----BEGIN OPENSSH PRIVATE KEY-----
-----END OPENSSH PRIVATE KEY-----

Публичный ключ так же нужно сконвертировать в формат PEM PKCS#8 (Можно это будет сделать на лету в момент шифрования):

ssh-keygen -f mykey.pub -e -m pkcs8 > mykey.pkcs8.pub
#или
openssl rsa -in mykey -pubout -outform PKCS8 > mykey.pkcs8.pub

Обмениваемся публичными ключами с партнёрами. Чтобы это подчеркнуть, при шифровании я буду использовать чужой публичный ключ anotherkey.pub.

Шифрование

Генерируем одноразовый сеансовый ключ (32 байта):

openssl rand -base64 32 -out key.bin

Шифруем передаваемые данные симметричным ключом:

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

Шифруем сеансовый ключ публичным ключом в формате PKCS#8:

openssl rsautl -encrypt -pubin -inkey anotherkey.pkcs8.pub -in key.bin -out key.bin.enc
# возможна конвертация на лету
openssl rsautl -encrypt -pubin -inkey <(ssh-keygen -e -m PKCS8 -f anotherkey.pub) -in key.bin -out key.bin.enc

Удаляем одноразовый ключ:

rm key.bin

Обмен файлами

По открытому каналу пересылаем bigdata.dat.enc и key.bin.enc.

Расшифровка

Расшифровываем секретным ключом сеансовый ключ. В реальной жизни вместо специально сгенерированного ключа mykey надо будет использовать стандартный ключ ~/.ssh/id_rsa:

openssl rsautl -decrypt -inkey mykey -in key.bin.enc -out key.bin

Расшифровываем данные:

openssl enc -d -aes-256-cbc -in bigdata.dat.enc -out bigdata.dat -pass file:./key.bin

Асимметричное шифрование маленьких файлов

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

# Encrypt openssl rsautl -encrypt -inkey <(ssh-keygen -e -m PKCS8 -f ~/.ssh/id_rsa.pub) -pubin -in small.dat -out small.dat.enc # Decrypt openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in small.dat.enc -out small.dat

Яндекс.Метрика