20130305

encrypt & decrypt with openssh rsa-keys

можно ли использовать публичный ключ openssh для безопасной передачи информации владельцу секретной части того же самого ключа?
краткий ответ: да.
но, увы, не так удобно, как, например, с помощью gpg.
но, увы, только в случае rsa-ключа.

теоретические соображения:
  1. в openssh используется ассиметричное шифрование: пара, состоящая из публичного и секретного ключей;
  2. к сожалению, в openssh нет инструментов для (де-)шифрования с помощью этих ключей;
  3. к счастью, такие средства есть в openssl (по крайней мере для rsa-ключей);
  4. к сожалению, openssl (пока) не понимает формата, в котором openssh хранит публичные ключи;
  5. к счастью, openssh (точнее, программа ssh-keygen) умеет конвертировать свои публичные ключи в формат pkcs8, который уже может «понять» openssl;
  6. к сожалению, это умеет делать только openssh v5.6 и выше (в debian squeeze — v5.5);
  7. к счастью, публичные rsa-ключи можно сконвертировать с помощью такого, например, скриптика: https://gist.github.com/sash-kan/5081128.
практика:


ssh.pub — публичный rsa-ключ вашего адресата;
ssh.sec — секретный rsa-ключ вашего адресата (обычно ~/.ssh/id_rsa);
sshpub-to-rsa — скрипт по ссылке, приведённой выше.

шифрование (на вашей стороне) при наличии openssh v5.6 и выше:
$ echo 'secret!!11' | openssl rsautl -encrypt -pubin -inkey \
<(ssh-keygen -f ssh.pub -e -m pkcs8) > secret.message

шифрование (на вашей стороне) при наличии openssh v5.5 и ниже:
$ echo 'secret!!11' | openssl rsautl -encrypt -pubin -inkey \
<(sshpub-to-rsa ssh.pub) > secret.message

расшифровка (на стороне вашего адресата):
$ cat secret.message | openssl rsautl -decrypt -inkey ssh.sec
secret!!11

Комментариев нет: