Dalam praktik saya yang masih kecil di bidang keamanan informasi, saya harus menghadapi beberapa masalah kriptografi, atau lebih tepatnya enkripsi, yang sulit saya temukan jawabannya. Oleh karena itu, saya memutuskan untuk menulis artikel pendek tentang dasar-dasar bekerja dengan OpenSSL.
Artikel ini akan membahas masalah pembuatan kunci yang terkenal, serta masalah kurang dikenal mengenkripsi ukuran file besar. Sertifikasi tidak ada pertanyaan di sini.
Mari kita mulai. Faktanya, semuanya sederhana sejauh ini.
Buat kunci pribadi dengan perintah.
openssl genrsa -out key.pem -aes-256-cfb -rand /var/log/messages 4096

Di sini:
genrsa - parameter yang menunjukkan pembuatan kunci oleh algoritma enkripsi RSA.
keluar - tempat membuat kunci.
4096 adalah panjang kunci.
Secara umum, ini cukup untuk membuat kunci. Tetapi kunci pribadi lebih baik untuk dienkripsi.
aes-256-cfb - algoritma dan mode enkripsi.
rand / var / log / messages - nilai acak dari folder mana pun, lebih baik mengambil log, karena dengan / dev / random atau / dev / urandom semuanya bisa bertahan, saya sudah memilikinya.
Saat membuat kunci, kata sandi akan diminta. Kata sandi adalah dasar dari perlindungan apa pun, jadi cobalah untuk menyelidikinya. Dan ingatlah.
Kami punya kunci. Pribadi Jangan pernah menunjukkan dan bersembunyi kepada siapa pun sesuai dengan prinsip Koshchei the Immortal.
Berdasarkan itu, kami akan membuat tampilan publik yang dapat dipajang di depan umum, setidaknya di dahi.
openssl rsa -in privatkey.pem -pubout -out publickey.pem

Sekarang kami memiliki sepasang kunci. Anda dapat mengunggah yang publik ke server untuk terhubung melalui ssh menggunakan kunci pribadi Anda. Atau untuk mengenkripsi sejumlah kecil data, misalnya, token atau frasa sandi, dll.
Tugas mengenkripsi file besar memiliki solusi yang berbeda.
Untuk mengenkripsi sejumlah besar data, kami menggunakan, misalnya, file pdf ini dengan ukuran 1,8 Mbytes.

Sejumlah besar data dienkripsi dengan algoritma enkripsi simetris, seperti AES. Di sini kita akan menggunakan enkripsi asimetris untuk mengirimkan kunci simetris, yang dengannya kita akan mengenkripsi teks.
Mari kita mulai.
Buat kunci sesi simetris (satu kali) dengan urutan karakter acak dan tulis ke file dalam representasi base64.
openssl rand -base64 32 > key.bin
Selanjutnya, kami mengenkripsi file dengan kunci ini:
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
aes-256-cfb - algoritma dan mode enkripsi. Saya tidak akan berbicara tentang mode di sini. Ini yang terbaik.
garam - garam untuk kekuatan kriptografi yang lebih besar.
pass file: ./ key.bin - kunci enkripsi.
Selanjutnya, kami mengenkripsi kunci simetris dengan kunci publik "asimetris" kami.
openssl rsautl -encrypt -inkey publickey.pem -pubin -in key.bin -out key.bin.enc

Punya file yang dienkripsi dan kunci simetris. Anda dapat mengirimkannya ke teman Anda untuk dekripsi. Tetapi kami akan mengirimkannya kepada diri kami sendiri, karena ini adalah pekerjaan rumah bagi kami sendiri.
Sekarang hapus kunci simetris yang asli! Sehingga tidak ada yang akan menemukannya.
shred -u key.bin
Pada gambar di bawah ini sudah tidak ada lagi.

Sekarang kita mendekripsi kunci simetris dengan kunci asimetris pribadi kita.
openssl rsautl -decrypt -inkey privatkey.pem -in key.bin.enc -out key.bin
Dan kami, yang beruntung, sekali lagi memiliki kunci simetris untuk mendekripsi teks kami, yang masih dienkripsi.
Gambarnya lagi di bawah, ada kunci lagi.

Sekarang kita mendekripsi file yang dienkripsi dengan cipher enkripsi simetris dengan yang baru dienkripsi, tetapi kemudian didekripsi menggunakan cipher enkripsi asimetris, kunci simetris.
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
Bukti di bawah ini.

Sekarang: Mengapa begitu rumit? Mengapa Anda tidak dapat mengambil dan melakukan segalanya dengan enkripsi asimetris?
Kami mencoba, langsung ke penggaruk;)
Kami punya!
File dan kunci.

Kami mengenkripsi.
openssl rsautl -encrypt -inkey publickey.pem -pubin -in OWASP_Top_10-2017_\(en\).pdf -out OWASP_Top_10-2017_\(en\).pdf.enc
POW - POW - POOOOOOOOOOOOH. Kesalahannya. Terlalu banyak data untuk ukuran kunci. Untuk enkripsi asimetris, ukuran kunci harus lebih besar atau sama dengan plaintext.
OpenSSL, seperti dalam kesepakatan dengan iblis, memberi Anda apa yang Anda minta, tetapi bukan apa yang Anda inginkan. Benar, file yang dienkripsi kosong.

Tetapi Anda dapat mengenkripsi file yang lebih kecil dari kuncinya. Ayo kita coba.
Buat file kecil.
Sebagai contoh, saya melakukan ini:
echo "hellow world my name is admin is a secret text nobody know it hahahahaahah" > text.txt

Kami akan mengenkripsi dengan kunci publik kami, yang semua orang tahu di dunia!
openssl rsautl -encrypt -inkey publickey.pem -pubin -in text.txt -out text.txt.enc
Seperti yang Anda lihat di gambar bawah, file dienkripsi. Tidak ada yang jelas! Siapa yang mengerti siapa kamu?

Sekarang kami mendekripsi, setelah sebelumnya menghapus file sumber untuk kemurnian percobaan.
openssl rsautl -decrypt -inkey privatkey.pem -in text.txt.enc -out text.txt

Kami memiliki file yang didekripsi. Semuanya bagus.
Untuk mentransfer semua barang terenkripsi ini, lebih baik untuk menyandikan yang terakhir di base64. Oleh karena itu, sebelum mendekripsi, Anda harus mendekode terlebih dahulu.
Dikodekan.
openssl enc -base64 -in text.txt.enc -out text.txt.bs64

Diterjemahkan.
openssl enc -base64 -d -in text.txt.bs64 -out text.txt.enc

Dan lagi kita memiliki beleberd yang tidak ada yang mengerti! Jika Anda mengerti, maka dokumen ini bukan untuk Anda!
Ini adalah cara kerja enkripsi saat membuat kunci dan enkripsi data menggunakan utilitas OpenSSL sebagai contoh.
Nanti saya akan menjelaskan mode enkripsi blok cipher simetris.