Sekali lagi tentang OpenSSL

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.

Source: https://habr.com/ru/post/id417069/


All Articles