Генерация ключей 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