Bagaimana cara mengenkripsi pesan / teks dengan RSA & OpenSSL?

29

Saya memiliki kunci publik Alice. Saya ingin mengirim Alice pesan terenkripsi RSA. Bagaimana saya bisa melakukannya dengan menggunakan opensslperintah?

Pesannya adalah:

Hai Alice! Tolong bawakan malacpörkölt untuk makan malam!

LanceBaynes
sumber

Jawaban:

36

Di manual openssl ( opensslhalaman manual ), cari RSA, dan Anda akan melihat bahwa perintah untuk enkripsi RSA adalah rsautl. Kemudian baca rsautlhalaman manual untuk melihat sintaksnya.

echo 'Hi Alice! Please bring malacpörkölt for dinner!' |
openssl rsautl -encrypt -pubin -inkey alice.pub >message.encrypted

Skema padding default adalah PKCS # 1 v1.5 asli (masih digunakan di banyak procotols); openssl juga mendukung OAEP (sekarang disarankan) dan enkripsi mentah (hanya berguna dalam keadaan khusus).

Perhatikan bahwa menggunakan openssl secara langsung sebagian besar merupakan latihan. Dalam praktiknya, Anda akan menggunakan alat seperti gpg (yang menggunakan RSA, tetapi tidak secara langsung mengenkripsi pesan).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Apa masalah dengan menggunakan openssl?
Bratchley
2
@Bratchley opensslAlat baris perintah adalah campuran dari berbagai perintah. Beberapa, sebagian besar yang memanipulasi sertifikat, dapat bermanfaat, tetapi sulit digunakan dengan benar karena sintaks dan parameternya unik. Beberapa, seperti rsautl, baik-baik saja tetapi tidak memberikan fungsionalitas yang berguna, mereka hanya mengekspos primitif kriptografi mentah - misalnya enkripsi RSA cukup banyak hanya digunakan untuk mengenkripsi kunci simetris untuk enkripsi hybrid. Beberapa, seperti enc, sangat sulit digunakan dengan aman dan dunia akan lebih baik jika mereka tidak ada.
Gilles 'SO- stop being evil'
Jawaban yang bagus Saya menambahkan padding dengan flag ini -oaep Kemudian pada mendekripsi, tentukan yang sama ... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet
24

Pertama, jika Anda hanya ingin enkripsi yang bagus, Anda harus melihat GnuPG . Tetapi jika Anda bereksperimen dan hanya ingin mempelajari cara kerjanya, Anda perlu memahami apa itu RSA . RSA tidak dirancang untuk mengenkripsi string sembarang, ini merupakan algoritma yang mengenkripsi integer. Secara khusus, bilangan bulat dari 0 hingga n-1 di mana n adalah nilai modulus dari kunci publik. Ketika Anda berbicara tentang kunci RSA yang 1024 bit, itu berarti dibutuhkan 1024 bit untuk menyimpan modulus dalam biner. Ini adalah salah satu alasan, RSA digunakan dalam kombinasi dengan kunci sandi simetris seperti DES atau AES. Anda dapat membuat kunci 256 bit acak untuk AES dan mengenkripsi kunci itu dengan kunci publik RSA 1024 bit. Kemudian siapa pun yang mengakses kunci pribadi dapat mengekstrak kunci simetris dan mendekode pesan dengan AES. Standar lengkap untuk RSA disebut PKCS # 1

Lebih jauh, DES dan AES adalah cipher blok. Mereka hanya mengenkripsi data dalam blok ukuran tertentu. DES menggunakan blok 64-bit dan AES menggunakan blok 128-bit. Untuk mengenkripsi lebih dari satu blok, Anda harus menggunakan Mode Operasi seperti CBC atau CTR. Mode ini menentukan cara mengenkripsi aliran bit menggunakan cipher mode blok.

Terakhir, penting untuk memverifikasi data yang Anda terima. Sementara penyerang mungkin tidak dapat membaca data dalam perjalanan, ia mungkin dapat membalik bit tanpa deteksi jika tidak ada integritas atau keaslian yang diterapkan pada aliran data. Seorang penyerang dapat dengan mudah menebak bahwa koneksi SSL ke port 443 mungkin merupakan permintaan halaman web yang dimulai dengan GET /dan ia dapat membalik bit untuk mengubahnya PUT /tanpa mengganggu enkripsi lainnya. Pendekatan sederhana untuk integritas adalah menambahkan jumlah MD5 atau SHA-1 pada akhirnya, tetapi itu hanya memberikan integritas data, bukan keaslian data. Siapa pun yang memiliki pengetahuan lengkap tentang aliran data dapat menghasilkan jumlah yang benar, pendekatan yang lebih aman adalah dengan menggunakan hash kunci seperti HMAC yang membutuhkan pengetahuan tentang kunci rahasia untuk menghasilkan sehingga memberikan keaslian data selain integritas.

penguin359
sumber
2
Ini sangat bagus
mko
5

Di bawah ini, perhatikan Anda dapat menentukan algoritma apa pun yang Anda inginkan, baik itu yang terdaftar atau RSA (meskipun saya tidak tahu nama pasti yang digunakan untuk RSA oleh OpenSSL)

gunakan "openssl enc -help" untuk mendapatkan daftar sandi yang didukung pada sistem Anda, dan berikan itu sebagai argumen. mis., "-aes256"

Catatan pada sistem saya, saya tidak memiliki RSA di opsi saya - setidaknya dengan nama itu.


Bagaimana cara mengenkripsi pesan S / MIME?

Katakanlah seseorang mengirimi Anda sertifikat publiknya dan meminta Anda mengenkripsi beberapa pesan kepadanya. Anda telah menyimpan sertifikatnya sebagai her-cert.pem. Anda telah menyimpan balasan Anda sebagai my-message.txt.

Untuk mendapatkan enkripsi RC2-40 standar — meskipun cukup lemah, Anda cukup memberi tahu openssl di mana pesan dan sertifikat berada.

openssl smime her-cert.pem -encrypt -in-my-message.txt

Jika Anda cukup yakin koresponden jauh Anda memiliki toolkit SSL yang kuat, Anda dapat menentukan algoritma enkripsi yang lebih kuat seperti triple DES:

openssl smime her-cert.pem -encrypt -des3 -in-my-message.txt

Secara default, pesan terenkripsi, termasuk header surat, dikirim ke output standar. Gunakan opsi -out atau shell Anda untuk mengarahkannya ke file. Atau, jauh lebih rumit, pipa output langsung ke sendmail.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

Bagaimana cara saya menandatangani pesan S / MIME?

Jika Anda tidak perlu mengenkripsi seluruh pesan, tetapi Anda ingin menandatanganinya sehingga penerima Anda dapat yakin dengan integritas pesan, resepnya mirip dengan enkripsi. Perbedaan utamanya adalah Anda harus memiliki kunci dan sertifikat Anda sendiri, karena Anda tidak dapat menandatangani apa pun dengan sertifikat penerima.

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My signed reply' |\
 sendmail [email protected]

(dari http://www.madboa.com/geek/openssl/ )

(er ... semua garis miring terbalik - yang seharusnya lolos dari baris baru. tidak yakin apa yang terjadi, karena akan ditampilkan dengan baik di kotak edit saya di sini!

draeath
sumber
1
Anda perlu menempatkan empat spasi di awal setiap baris untuk mempertahankan baris baru. Saya mengubah blok pertama untuk menunjukkan caranya. Bisakah Anda memperbaiki yang kedua?
Mikel
1
Anda tidak menemukan RSA di openssl enckarena enchanya untuk enkripsi simetris. Ya, opsi openssl tidak terorganisir dengan baik. Algoritma asimetri memiliki perintah sendiri: rsa/ dsa/ dhuntuk memanipulasi kunci, rsautl/ dsautluntuk mengenkripsi / mendekripsi / memverifikasi / menandatangani, dan genrsa/ gendsa/ gendhuntuk menghasilkan kunci.
Gilles 'SO- stop being evil'