В моей ещё небольшой практике в сфере информационной безопасности мне пришлось столкнуться с некоторыми вопросами криптографии, а точнее шифрования, внятные ответы на которые мне удалось найти с трудом. Потому решил написать небольшую статью по основам работы с OpenSSL.
В этой статье будут рассмотрены известные вопросы генерации ключей, а также менее известный вопрос шифрования файлов больших объемов. О сертификации здесь не будет речи.
Начнем. На самом деле пока все просто.
Создадим приватный ключ командой.
![](https://habrastorage.org/r/w1560/webt/kh/8f/pm/kh8fpmllta6ay9cwvgxdfbcc5qy.png)
Здесь:
genrsa — парметр указывающий на создание ключа алгоритмом шифрования RSA.
out — где создать ключ.
4096 — длина ключа.
Вообще этого для создания ключа достаточно. Но приватный ключ лучше зашифровать.
aes-256-cfb — алгоритм и режим шифрования.
rand /var/log/messages — рандомное значения из любой папки, лучше взять логи, т.к. с /dev/random или /dev/urandom может все повиснуть наглухо, у меня так и было.
При создании ключа будет запрошен пароль. Пароль — это основа любой защиты, так что постарайтесь покорпеть над ним. И запомнить.
Имеем ключ. Приватный. Никому никогда не показывать и спрятать по принципу Кощея Бессмертного.
На его основе сделаем публичный, который можно хоть на всеобщее обозрение выложить, хоть на лоб приклеить.
![](https://habrastorage.org/r/w1560/webt/rt/w6/97/rtw697jfacjjr1ll5bzmjhm_pyg.png)
Теперь у нас есть пара ключей. Публичный можно закинуть на сервер, чтобы подключаться к нему по ssh, используя свой приватный ключ. Либо для шифрования небольшого количества данных, например, токена или парольной фразы и т.п.
Задача шифрования большого файла имеет другое решение.
Для шифрования большого количества данных используем, например, этот файл pdf размером 1,8 Mbytes.
![](https://habrastorage.org/r/w1560/webt/e7/pu/j3/e7puj3mtbjua621dlfjgvgxkzek.png)
Большой объем данных шифруется симметричным алгоритмом шифрования, например, AES. Здесь мы применим и асимметричное шифрование для передачи симметричного ключа, с помощью которого мы и будем шифровать текст.
Начнем.
Создадим симметричный сессионный (одноразовый) ключ рандомной последовательностью символов и запишем в файл в представлении base64.
Далее зашифруем файл этим ключом:
![](https://habrastorage.org/r/w1560/webt/gx/cz/hb/gxczhblrlqfyup8zdle-mwywnho.png)
aes-256-cfb — алгоритм и режим шифрования. О режимах здесь не буду говорить. Этот лучший.
salt — соль для большей криптостойкости.
pass file:./key.bin — ключ шифрования.
Далее зашифруем симметричный ключ нашим публичным «ассиметричным» ключом.
![](https://habrastorage.org/r/w1560/webt/yz/qe/oz/yzqeozpp3fg-9hcumrfba8q1m3w.png)
Получили зашифрованный файл и симметричный ключ. Можно слать своему товарищу для расшифровки. Но мы пошлем сами себе, ибо это homework c самим с собой.
Теперь удалим изначальный симметричный ключ! Чтобы никто и никогда не нашел его.
На картинке внизу его уже нет.
![](https://habrastorage.org/r/w1560/webt/bz/fe/wc/bzfewchtkwxpjpz-jcrqjdy9twq.png)
Теперь расшифруем симметричный ключ нашим приватным ассиметричным ключом.
И мы, счастливчики, снова имеем симметричный ключ для расшифрования нашего текста, пока еще зашифрованного.
Картинка снова внизу, там ключ вновь есть.
![](https://habrastorage.org/r/w1560/webt/0-/yd/v-/0-ydv-wqdoblfm9sjmf0ntdymx4.png)
Теперь расшифруем зашифрованный шифром симметричного шифрования файл нашим недавно зашифрованным, но потом расшифрованным с помощью ассиметричного шифра шифрования симметричным ключом.
Пруф внизу.
![](https://habrastorage.org/r/w1560/webt/3j/_l/ow/3j_lowucixi7upo1q9ahbhq20vi.png)
Теперь: Почему так сложно? Почему нельзя взять и сделать все с помощью ассиметричного шифрования?
Пробуем, идем прямиком на грабли;)
Имеем!
Файл и ключи.
![](https://habrastorage.org/r/w1560/webt/zr/kh/kj/zrkhkjprmdfg3qutmejnn88htky.png)
Шифруем.
Поу — поу — поооооууууу. Ошибка. Слишком много данных для размера ключа. Ибо в ассиметричном шифровании размер ключа должен быть больше или равен открытому тексту.
OpenSSL, как при сделке с дьяволом, дал Вам то, чего Вы попросили, но не чего хотели. Правда, зашифрованный файл оказался пуст.
![](https://habrastorage.org/r/w1560/webt/rm/4o/kk/rm4okk8wukgzju8nv-e2f4kgiwi.png)
Но можно зашифровать меньший, чем ключ файл. Попробуем.
Создадим небольшой файл.
Например, я сделал так:
![](https://habrastorage.org/r/w1560/webt/ey/5g/m6/ey5gm69wehxctaesq9ye3d6e_5y.png)
Зашифруем его нашим публичным ключом, который знают все на свете!
Как видим на нижней картинке файл зашифрован. Ничего не понятно! Кому понятно, КТО ВЫ?
![](https://habrastorage.org/r/w1560/webt/a_/f5/sn/a_f5sn9rowfgx2ljydo4cnpvsyy.png)
Теперь расшифруем, предварительно удалив для чистоты эксперимента исходный файл.
![](https://habrastorage.org/r/w1560/webt/1r/ic/gz/1ricgzasvowe3ia0xo3eqfwfki4.png)
Имеем расшифрованный файл. Все отлично.
Для передачи всего этого зашифрованного добра лучше последнее кодировать в base64. Соответственно перед тем как расшифровать, нужно сначала раскодировать.
Закодировали.
![](https://habrastorage.org/r/w1560/webt/jm/dg/cp/jmdgcp7dwf5t02vt9rtyrj7_nbg.png)
Раскодировали.
![](https://habrastorage.org/r/w1560/webt/1u/tt/mu/1uttmupoe0muyrjnihhizcc-pdy.png)
И снова имеем белеберду, которая никому не понятна! Если Вам понятна, то этот документ не для Вас!
Примерно так работает шифрование при создании ключей и шифрованиие данных на примере утилиты OpenSSL.
Позже собираюсь описать режимы шифрования блочных симметричных шифров.
В этой статье будут рассмотрены известные вопросы генерации ключей, а также менее известный вопрос шифрования файлов больших объемов. О сертификации здесь не будет речи.
Начнем. На самом деле пока все просто.
Создадим приватный ключ командой.
openssl genrsa -out key.pem -aes-256-cfb -rand /var/log/messages 4096
![](https://habrastorage.org/webt/kh/8f/pm/kh8fpmllta6ay9cwvgxdfbcc5qy.png)
Здесь:
genrsa — парметр указывающий на создание ключа алгоритмом шифрования RSA.
out — где создать ключ.
4096 — длина ключа.
Вообще этого для создания ключа достаточно. Но приватный ключ лучше зашифровать.
aes-256-cfb — алгоритм и режим шифрования.
rand /var/log/messages — рандомное значения из любой папки, лучше взять логи, т.к. с /dev/random или /dev/urandom может все повиснуть наглухо, у меня так и было.
При создании ключа будет запрошен пароль. Пароль — это основа любой защиты, так что постарайтесь покорпеть над ним. И запомнить.
Имеем ключ. Приватный. Никому никогда не показывать и спрятать по принципу Кощея Бессмертного.
На его основе сделаем публичный, который можно хоть на всеобщее обозрение выложить, хоть на лоб приклеить.
openssl rsa -in privatkey.pem -pubout -out publickey.pem
![](https://habrastorage.org/webt/rt/w6/97/rtw697jfacjjr1ll5bzmjhm_pyg.png)
Теперь у нас есть пара ключей. Публичный можно закинуть на сервер, чтобы подключаться к нему по ssh, используя свой приватный ключ. Либо для шифрования небольшого количества данных, например, токена или парольной фразы и т.п.
Задача шифрования большого файла имеет другое решение.
Для шифрования большого количества данных используем, например, этот файл pdf размером 1,8 Mbytes.
![](https://habrastorage.org/webt/e7/pu/j3/e7puj3mtbjua621dlfjgvgxkzek.png)
Большой объем данных шифруется симметричным алгоритмом шифрования, например, AES. Здесь мы применим и асимметричное шифрование для передачи симметричного ключа, с помощью которого мы и будем шифровать текст.
Начнем.
Создадим симметричный сессионный (одноразовый) ключ рандомной последовательностью символов и запишем в файл в представлении base64.
openssl rand -base64 32 > key.bin
Далее зашифруем файл этим ключом:
openssl enc -aes-256-cfb -salt -in OWASP_Top_10-2017_\(en\).pdf -out OWASP_Top_10-2017_\(en\).pdf.enc -pass file:./key.bin
![](https://habrastorage.org/webt/gx/cz/hb/gxczhblrlqfyup8zdle-mwywnho.png)
aes-256-cfb — алгоритм и режим шифрования. О режимах здесь не буду говорить. Этот лучший.
salt — соль для большей криптостойкости.
pass file:./key.bin — ключ шифрования.
Далее зашифруем симметричный ключ нашим публичным «ассиметричным» ключом.
openssl rsautl -encrypt -inkey publickey.pem -pubin -in key.bin -out key.bin.enc
![](https://habrastorage.org/webt/yz/qe/oz/yzqeozpp3fg-9hcumrfba8q1m3w.png)
Получили зашифрованный файл и симметричный ключ. Можно слать своему товарищу для расшифровки. Но мы пошлем сами себе, ибо это homework c самим с собой.
Теперь удалим изначальный симметричный ключ! Чтобы никто и никогда не нашел его.
shred -u key.bin
На картинке внизу его уже нет.
![](https://habrastorage.org/webt/bz/fe/wc/bzfewchtkwxpjpz-jcrqjdy9twq.png)
Теперь расшифруем симметричный ключ нашим приватным ассиметричным ключом.
openssl rsautl -decrypt -inkey privatkey.pem -in key.bin.enc -out key.bin
И мы, счастливчики, снова имеем симметричный ключ для расшифрования нашего текста, пока еще зашифрованного.
Картинка снова внизу, там ключ вновь есть.
![](https://habrastorage.org/webt/0-/yd/v-/0-ydv-wqdoblfm9sjmf0ntdymx4.png)
Теперь расшифруем зашифрованный шифром симметричного шифрования файл нашим недавно зашифрованным, но потом расшифрованным с помощью ассиметричного шифра шифрования симметричным ключом.
openssl enc -d -aes-256-cfb -in OWASP_Top_10-2017_\(en\).pdf.enc -out OWASP_Top_10-2017_\(en\)decrypt.pdf -pass file:./key.bin
Пруф внизу.
![](https://habrastorage.org/webt/3j/_l/ow/3j_lowucixi7upo1q9ahbhq20vi.png)
Теперь: Почему так сложно? Почему нельзя взять и сделать все с помощью ассиметричного шифрования?
Пробуем, идем прямиком на грабли;)
Имеем!
Файл и ключи.
![](https://habrastorage.org/webt/zr/kh/kj/zrkhkjprmdfg3qutmejnn88htky.png)
Шифруем.
openssl rsautl -encrypt -inkey publickey.pem -pubin -in OWASP_Top_10-2017_\(en\).pdf -out OWASP_Top_10-2017_\(en\).pdf.enc
Поу — поу — поооооууууу. Ошибка. Слишком много данных для размера ключа. Ибо в ассиметричном шифровании размер ключа должен быть больше или равен открытому тексту.
OpenSSL, как при сделке с дьяволом, дал Вам то, чего Вы попросили, но не чего хотели. Правда, зашифрованный файл оказался пуст.
![](https://habrastorage.org/webt/rm/4o/kk/rm4okk8wukgzju8nv-e2f4kgiwi.png)
Но можно зашифровать меньший, чем ключ файл. Попробуем.
Создадим небольшой файл.
Например, я сделал так:
echo "hellow world my name is admin is a secret text nobody know it hahahahaahah" > text.txt
![](https://habrastorage.org/webt/ey/5g/m6/ey5gm69wehxctaesq9ye3d6e_5y.png)
Зашифруем его нашим публичным ключом, который знают все на свете!
openssl rsautl -encrypt -inkey publickey.pem -pubin -in text.txt -out text.txt.enc
Как видим на нижней картинке файл зашифрован. Ничего не понятно! Кому понятно, КТО ВЫ?
![](https://habrastorage.org/webt/a_/f5/sn/a_f5sn9rowfgx2ljydo4cnpvsyy.png)
Теперь расшифруем, предварительно удалив для чистоты эксперимента исходный файл.
openssl rsautl -decrypt -inkey privatkey.pem -in text.txt.enc -out text.txt
![](https://habrastorage.org/webt/1r/ic/gz/1ricgzasvowe3ia0xo3eqfwfki4.png)
Имеем расшифрованный файл. Все отлично.
Для передачи всего этого зашифрованного добра лучше последнее кодировать в base64. Соответственно перед тем как расшифровать, нужно сначала раскодировать.
Закодировали.
openssl enc -base64 -in text.txt.enc -out text.txt.bs64
![](https://habrastorage.org/webt/jm/dg/cp/jmdgcp7dwf5t02vt9rtyrj7_nbg.png)
Раскодировали.
openssl enc -base64 -d -in text.txt.bs64 -out text.txt.enc
![](https://habrastorage.org/webt/1u/tt/mu/1uttmupoe0muyrjnihhizcc-pdy.png)
И снова имеем белеберду, которая никому не понятна! Если Вам понятна, то этот документ не для Вас!
Примерно так работает шифрование при создании ключей и шифрованиие данных на примере утилиты OpenSSL.
Позже собираюсь описать режимы шифрования блочных симметричных шифров.