Apa perbedaan antara mengenkripsi dan masuk ke enkripsi asimetris?


297

Apa perbedaan antara mengenkripsi beberapa data vs menandatangani beberapa data (menggunakan RSA)?

Apakah itu hanya membalikkan peran kunci publik-swasta?

Misalnya, saya ingin menggunakan kunci pribadi saya untuk menghasilkan pesan sehingga hanya saya yang bisa menjadi pengirimnya. Saya ingin kunci publik saya digunakan untuk membaca pesan dan saya tidak peduli siapa yang membacanya. Saya ingin dapat mengenkripsi informasi tertentu dan menggunakannya sebagai kunci produk untuk perangkat lunak saya. Saya hanya peduli bahwa saya adalah satu-satunya yang dapat menghasilkan ini. Saya ingin memasukkan kunci publik saya di perangkat lunak saya untuk mendekripsi / membaca tanda tangan kunci. Saya tidak peduli siapa yang bisa membaca data dalam kunci, saya hanya peduli bahwa saya adalah satu-satunya yang dapat diverifikasi yang dapat menghasilkan mereka.

Apakah penandatanganan berguna dalam skenario ini?

Jawaban:


441

Saat mengenkripsi, Anda menggunakan kunci publik mereka untuk menulis pesan dan mereka menggunakan kunci pribadi mereka untuk membacanya.

Saat menandatangani, Anda menggunakan kunci pribadi Anda untuk menulis tanda tangan pesan, dan mereka menggunakan kunci publik Anda untuk memeriksa apakah itu benar-benar milik Anda.

Saya ingin menggunakan kunci pribadi saya untuk menghasilkan pesan sehingga hanya saya yang bisa menjadi pengirimnya.

Saya ingin kunci publik saya digunakan untuk membaca pesan dan saya tidak peduli siapa yang membacanya

Ini penandatanganan , dilakukan dengan kunci pribadi Anda.

Saya ingin dapat mengenkripsi informasi tertentu dan menggunakannya sebagai kunci produk untuk perangkat lunak saya.

Saya hanya peduli bahwa saya adalah satu-satunya yang dapat menghasilkan ini.

Jika Anda hanya perlu mengetahuinya untuk diri sendiri, Anda tidak perlu dipusingkan dengan kunci untuk melakukan ini. Anda bisa menghasilkan data acak dan menyimpannya di dalam basis data.

Tetapi jika Anda ingin orang tahu bahwa kunci itu benar-benar milik Anda, Anda perlu membuat data acak, menyimpannya di dalam database DAN menandatanganinya dengan kunci Anda.

Saya ingin memasukkan kunci publik saya di perangkat lunak saya untuk mendekripsi / membaca tanda tangan kunci.

Anda mungkin perlu membeli sertifikat untuk kunci publik Anda dari penyedia komersial seperti Verisign atau Thawte, sehingga orang dapat memeriksa bahwa tidak ada yang memalsukan perangkat lunak Anda dan mengganti kunci publik Anda dengan milik mereka.


7
Secara teknis, ketika Anda mengatakan kunci pribadi digunakan untuk menulis tanda tangan pesan, Anda mengatakan bahwa hash pesan sedang dienkripsi dengan kunci pribadi saya?
Andy Ibanez

4
@AndyIbanez: apa yang dienkripsi ( intisari ) mungkin juga termasuk stempel waktu dan beberapa garam acak, tapi ya, itulah intinya.
Quassnoi

7
@Quassnoi Sebenarnya ketika kita mengatakan 'masuk dengan kunci pribadi', itu berarti bukan 'mengenkripsi' tetapi sebaliknya berarti 'mendekripsi'. Menandatangani pesan secara kasar sama dengan mendekripsi dengan kunci pribadi dan di penerima mengenkripsi dengan kunci publik, dengan cara ini hash akan menjadi sama dan dapat dibandingkan.
Johnny Willer 6-15

5
@JohnnyWiller: seperti @slim disebutkan di bawah, inti matematika adalah sama untuk fungsi mengenkripsi dan mendekripsi. Mereka bukan fungsi yang terpisah, mereka adalah fungsi yang sama f(key, message), sehinggaf(private, f(public, message)) === f(public, f(private, message)) === message
Quassnoi

2
@ Sayang tidak, tidak. Menghasilkan pasangan kunci gratis. Biaya yang dikeluarkan membuat orang lain percaya bahwa tanda tangan itu benar-benar milik Anda. Untuk melakukan itu, Anda memiliki kunci publik itu sendiri, yang sebelumnya Anda hasilkan secara gratis, ditandatangani oleh otoritas yang mungkin atau mungkin tidak mengenakan biaya uang untuk itu.
Quassnoi

143

Di RSA crypto, saat Anda menghasilkan pasangan kunci, sepenuhnya sewenang-wenang mana yang Anda pilih untuk menjadi kunci publik, dan yang merupakan kunci pribadi. Jika Anda mengenkripsi satu, Anda dapat mendekripsi dengan yang lain - itu bekerja di kedua arah.

Jadi, cukup mudah untuk melihat bagaimana Anda dapat mengenkripsi pesan dengan kunci publik penerima , sehingga penerima dapat mendekripsi pesannya dengan kunci pribadi mereka .

Tanda tangan adalah bukti bahwa penandatangan memiliki kunci pribadi yang cocok dengan beberapa kunci publik. Untuk melakukan ini, cukup mengenkripsi pesan dengan kunci pribadi pengirim itu , dan menyertakan versi terenkripsi di samping versi plaintext. Untuk memverifikasi pengirim, dekripsi versi terenkripsi, dan periksa apakah itu sama dengan plaintext.

Tentu saja, ini berarti pesan Anda tidak rahasia. Siapa pun dapat mendekripsi, karena kunci publik sudah dikenal luas. Tetapi ketika mereka melakukannya, mereka telah membuktikan bahwa pencipta ciphertext memiliki kunci pribadi yang sesuai.

Namun, ini berarti menggandakan ukuran transmisi Anda - plaintext dan ciphertext bersamaan (dengan asumsi Anda ingin orang yang tidak tertarik memverifikasi tanda tangan, untuk membaca pesan). Jadi alih-alih, biasanya tanda tangan dibuat dengan membuat hash dari plaintext. Penting bahwa hash palsu tidak dapat dibuat, jadi digunakan algoritma hash kriptografis seperti SHA-2.

Begitu:

  • Untuk menghasilkan tanda tangan, buat hash dari plaintext, enkripsi dengan kunci pribadi Anda, sertakan di samping plaintext.
  • Untuk memverifikasi tanda tangan, buat hash dari plaintext, dekripsi tanda tangan dengan kunci publik pengirim, periksa apakah kedua hash itu sama.

8
@headcode hanya berlaku untuk kunci asimetris. Kunci simetris tidak berpasangan.
langsing

3
Bahkan, itu hanya berlaku untuk kunci RSA. Dengan kunci ECDSA, misalnya, Anda dapat membuat kunci publik dari kunci pribadi, dan kunci pribadi adalah skalar, sementara kunci publik adalah koordinat.
David Schwartz

5
Bagaimana Anda bisa mendekripsi pesan dengan kunci PUBLIC? Bukankah pesan hanya didekripsi dengan kunci pribadi?
daremkd

3
5 sumber yang bertentangan dengan jawaban ini 1 , 2 , 3 , 4 , 5
wha7ever

6
Bukan sembarang yang Anda sebut publik dan pribadi. Anda bisa membuat kunci publik dari kunci privat, tetapi Anda tidak bisa membuat kunci privat dari kunci publik. Bukankah itu perbedaan besar?
Greg Schmit

23

Ada dua masalah yang berbeda tetapi terkait erat dalam membangun komunikasi yang aman

  1. Enkripsi data sehingga hanya orang yang berwenang yang dapat mendekripsi dan membacanya.
  2. Verifikasi identitas / otentikasi pengirim.

Kedua masalah ini dapat diselesaikan secara elegan menggunakan kriptografi kunci publik.

I. Enkripsi dan dekripsi data

Alice ingin mengirim pesan kepada Bob yang tidak bisa dibaca siapa pun.

  • Alice mengenkripsi pesan dengan kunci publik Bob dan mengirimkannya.
  • Bob menerima pesan dan mendekripsi menggunakan Kunci pribadinya.

Perhatikan bahwa jika A ingin mengirim pesan ke B, A perlu menggunakan kunci Publik B (yang tersedia untuk umum bagi siapa saja) dan baik kunci publik maupun kunci pribadi A tidak terlihat di sini.

Jadi jika Anda ingin mengirim pesan kepada saya, Anda harus tahu dan menggunakan kunci publik saya yang saya berikan kepada Anda dan hanya saya yang akan dapat mendekripsi pesan tersebut karena saya adalah satu-satunya yang memiliki akses ke kunci pribadi yang sesuai.

II Verifikasi identitas pengirim (Otentikasi)

Alice ingin mengirim pesan kepada Bob lagi. Masalah mengenkripsi data diselesaikan dengan menggunakan metode di atas.

Tetapi bagaimana jika saya duduk di antara Alice dan Bob, memperkenalkan diri saya sebagai 'Alice' ke Bob dan mengirimkan pesan saya sendiri kepada Bob alih-alih meneruskan pesan yang dikirim oleh Alice. Meskipun saya tidak dapat mendekripsi dan membaca pesan asli yang dikirim oleh Alice (yang membutuhkan akses ke kunci pribadi Bob), saya membajak seluruh percakapan di antara mereka.

Apakah ada cara Bob dapat mengkonfirmasi bahwa pesan yang diterimanya sebenarnya dikirim oleh Alice?

  • Alice menandatangani pesan dengan kunci pribadinya dan mengirimkannya. (Dalam praktiknya, apa yang ditandatangani adalah hash dari pesan, misalnya SHA-256 atau SHA-512.)
  • Bob menerimanya dan memverifikasinya menggunakan kunci publik Alice. Karena kunci publik Alice berhasil memverifikasi pesan, Bob dapat menyimpulkan bahwa pesan telah ditandatangani oleh Alice.

1
Jadi, ketika Anda menandatangani pesan, apakah Anda menandatangani pesan itu sendiri atau pesan terenkripsi?
FrostyStraw

21

Ya, pikirkan menandatangani data sebagai memberikan cap lilin Anda sendiri yang tidak dimiliki orang lain. Hal ini dilakukan untuk mencapai integritas dan non-penyangkalan . Enkripsi begitu tidak ada orang lain yang dapat melihat data. Ini dilakukan untuk mencapai kerahasiaan . Lihat wikipedia http://en.wikipedia.org/wiki/Information_security#Key_concepts

Tanda tangan adalah hash dari pesan Anda yang ditandatangani menggunakan kunci pribadi Anda.


16

Signing menghasilkan "hash" dengan kunci pribadi Anda yang dapat diverifikasi dengan kunci publik Anda. Teks dikirim dengan jelas.

Enkripsi menggunakan kunci publik penerima untuk mengenkripsi data; decoding dilakukan dengan kunci privat mereka.

Jadi, penggunaan kunci tidak terbalik (jika kunci pribadi Anda tidak akan menjadi pribadi lagi!).


Dalam enkripsi Asymmetric normal, enkripsi dilakukan dengan kunci publik penerima, bukan kunci pribadi Anda.
mmcdole

Apakah Anda melewatkan bahwa pertanyaan ini adalah khusus tentang RSA dimana penggunaan tombol yang terbalik dan di mana tidak membahayakan kunci pribadi.
David Schwartz

8

Anda menjelaskan dengan tepat bagaimana dan mengapa penandatanganan digunakan dalam kriptografi kunci publik. Perhatikan bahwa sangat berbahaya untuk menandatangani (atau mengenkripsi) pesan tidak sengaja yang disediakan oleh orang lain - ini memungkinkan serangan pada algoritme yang dapat membahayakan kunci Anda.


1
Jangan browser web mengenkripsi data sewenang-wenang saat menggunakan SSL?
Ian Warburton

2
@ IanWarburton: Tapi mereka tidak menggunakan enkripsi asimetris untuk itu. Transfer data aktual menggunakan enkripsi simetris dengan kunci sesi yang dibuat secara acak.
Michael Borgwardt

1
@IanWarburton: tidak, karena keduanya tidak akan dipilih oleh penyerang. Bahayanya terletak pada mengenkripsi atau menandatangani sesuatu yang secara langsung disediakan oleh penyerang, karena hal itu dapat dengan sengaja dibuat untuk mengungkapkan informasi tentang kunci pribadi Anda, atau bahkan membuat tanda tangan yang tampak valid untuk sesuatu yang tidak ingin Anda tanda tangani. Rincian terperinci tentang bagaimana kasus terakhir bekerja untuk RSA ada di sini: crypto.stackexchange.com/questions/35644/…
Michael Borgwardt

2
@IanWarburton: itu sebabnya RSA membutuhkan padding, jadi Anda tidak pernah mengenkripsi hanya pesan pilihan: en.wikipedia.org/wiki/… - tapi itu benar-benar operasi yang melibatkan kunci pribadi (seperti penandatanganan) yang sangat rentan terhadap input yang dipilih.
Michael Borgwardt

1
@IanWarburton Saya bukan ahli kriptografi, tetapi dari apa yang saya pahami, itu seharusnya tidak menyebabkan masalah.
Michael Borgwardt

8

Tanda tangan menunjukkan bahwa Anda benar-benar sumber atau jaminan dari objek yang ditandatangani. Setiap orang dapat membaca objeknya.

Mengenkripsi berarti hanya orang-orang dengan kunci privat yang sesuai yang dapat membacanya, tetapi tanpa menandatangani tidak ada jaminan Anda berada di belakang objek yang dienkripsi.


Jika pesan didekripsi oleh kunci pubis saya maka hanya saya yang bisa mengirimnya. (Dengan asumsi kunci pribadi saya tidak terganggu)
Dojo

5

Apa perbedaan antara mengenkripsi beberapa data vs menandatangani beberapa data (menggunakan RSA)?

Enkripsi menjaga kerahasiaan pesan ("beberapa data"), sementara menandatangani memberikan non-repudiation: yaitu hanya entitas yang menandatanganinya yang bisa menandatanganinya. Ada perbedaan fungsional juga; baca terus.

Apakah itu hanya membalikkan peran kunci publik-swasta?

Benar-benar tidak. Penggunaan kunci pribadi yang sama untuk menandatangani dan mendekripsi (atau, juga, kunci publik yang sama untuk verifikasi dan enkripsi ) disukai, karena Anda tidak boleh mencampuradukkan tujuan. Ini bukan masalah matematika (RSA masih harus aman), tetapi masalah dengan manajemen kunci , di mana misalnya kunci penandatanganan harus memiliki live yang lebih pendek dan mengandung lebih banyak perlindungan sebelum digunakan.

Untuk pesan yang sama, Anda harus menggunakan kunci pribadi pengirim untuk menandatangani dan penerima kunci publik tepercaya untuk enkripsi. Secara umum tanda-kemudian-enkripsi digunakan jika musuh dapat mengganti tanda tangan dengan miliknya. Anda juga harus menggunakan kunci pribadi penerima untuk dekripsi dan kunci publik tepercaya dari pengirim untuk verifikasi.

Selain itu, Anda harus memahami bahwa pembuatan tanda tangan tidak menggunakan "enkripsi dengan kunci pribadi". Meskipun semua operasi RSA didasarkan pada eksponensial modular, skema padding sepenuhnya berbeda untuk pembuatan tanda tangan. Selain itu, kunci publik memiliki sifat yang sepenuhnya berbeda dari kunci pribadi RSA dalam semua penggunaan praktis RSA.

Misalnya, saya ingin menggunakan kunci pribadi saya untuk menghasilkan pesan sehingga hanya saya yang bisa menjadi pengirimnya.

Itu properti non-penolakan, yang dapat dicapai dengan menandatangani.

Saya ingin kunci publik saya digunakan untuk membaca pesan dan saya tidak peduli siapa yang membacanya.

Kunci publik harus dianggap diketahui oleh semua orang. Jika Anda ingin semua orang membaca pesan, maka Anda tidak mengenkripsi pesan itu.

Penandatanganan umumnya tidak akan memengaruhi konten pesan. Pesan dianggap terpisah dari tanda tangan. Secara resmi tanda tangan semacam itu dikenal sebagai "tanda tangan dengan lampiran" di mana lampiran adalah pesannya. Itu nama yang agak aneh karena pesannya dianggap lebih penting daripada tanda tangan di atasnya, tapi ya. Hanya beberapa tanda tangan yang menawarkan pemulihan pesan (sebagian); mereka tidak banyak digunakan lagi dan umumnya dianggap usang.

Perhatikan bahwa protokol tanda tangan seperti CMS dapat menggunakan format wadah yang mencakup pesan dan tanda tangan. Dalam hal ini, pertama-tama Anda perlu mengeluarkan - masih tidak terenkripsi - dari wadah, seperti membuka ritsleting file dari arsip .zip biasa. Jadi pesan tersebut dapat disembunyikan dari pandangan dan tidak dapat langsung digunakan dalam kasus itu.

Saya ingin dapat mengenkripsi informasi tertentu dan menggunakannya sebagai kunci produk untuk perangkat lunak saya. Saya hanya peduli bahwa saya adalah satu-satunya yang dapat menghasilkan ini.

Enkripsi digunakan untuk mencapai kerahasiaan. Di masa lalu, RSA menghasilkan tanda tangan yang sering dianggap sebagai "enkripsi dengan kunci pribadi". Namun, operasinya sangat berbeda seperti yang dijelaskan di atas, dan standar kemudian berusaha mati-matian dan memisahkan enkripsi dan pembuatan tanda tangan.

Saya ingin memasukkan kunci publik saya di perangkat lunak saya untuk mendekripsi / membaca tanda tangan kunci. Saya tidak peduli siapa yang bisa membaca data dalam kunci, saya hanya peduli bahwa saya adalah satu-satunya yang dapat diverifikasi yang dapat menghasilkan mereka.

Ya, ini disebut membangun kepercayaan pada kunci publik. Namun, melindungi kode program Anda sangat berbeda dari melindungi pesan. Anda dapat melakukan penandatanganan kode tetapi Anda perlu sesuatu untuk memeriksa tanda tangan di luar kode Anda . Ada sistem operasi yang menawarkan ini.

Ada Microsoft Authenticode misalnya. Toko aplikasi seperti toko aplikasi iStore dan Android mungkin atau mungkin tidak menggunakan penandatanganan kode, tetapi mereka menawarkan jaminan bahwa aplikasi Anda tidak dikloning atau setidaknya tidak dikloning di dalam toko. Bagaimanapun, kriptografi tidak selalu merupakan solusi.

Menjaga kode Anda tidak dikloning / diubah sama sekali jauh lebih sulit, dan Anda akan solid di wilayah DRM jika Anda pergi ke arah itu.

Apakah penandatanganan berguna dalam skenario ini?

Ya, tentu saja. Tentu dapat membantu memastikan bahwa pesan-pesan itu hanya ditandatangani oleh Anda, jika ada kepercayaan pada kunci publik. Jika dapat membantu untuk mengotentikasi kode aplikasi Anda / kunci publik terintegrasi sepenuhnya tergantung pada lingkungan yang Anda inginkan untuk menjalankan kode.


"Di masa lalu, generasi tanda tangan RSA sering dianggap sebagai" enkripsi dengan kunci privat ". Namun, operasinya sangat berbeda seperti yang dijelaskan di atas, dan standar kemudian berusaha mati-matian untuk memisahkan enkripsi dan generasi tanda tangan." - ini tidak jelas bagiku. Entah KeyPair dapat berupa pk atau sk dan apa yang dienkripsi yang lainnya dapat didekripsi. Jika kita sepakat tentang itu, lalu bagaimana kita bisa berpendapat bahwa menandatangani dan mengenkripsi berbeda dengan cara yang berarti? Kedua mengenkripsi dan kemudian hanya dapat didekripsi dengan kunci lainnya. Saya telah melihat referensi untuk fungsi penandatanganan, apakah ini terkait?
Morgan

Satu-satunya perbedaan yang saya ketahui dalam fungsi penandatanganan adalah hashing dari pesan sebelum enkripsi.
Morgan

4

Dalam skenario Anda, Anda tidak mengenkripsi dalam arti enkripsi asimetris; Saya lebih suka menyebutnya "encode".

Jadi Anda menyandikan data Anda ke beberapa representasi biner, kemudian Anda masuk dengan kunci pribadi Anda. Jika Anda tidak dapat memverifikasi tanda tangan melalui kunci publik Anda, Anda tahu bahwa data yang ditandatangani tidak dibuat dengan kunci pribadi Anda. ("verifikasi" yang berarti bahwa data yang tidak ditandatangani tidak berarti)


2

Secara fungsional, Anda menggunakan enkripsi kunci publik / pribadi untuk memastikan hanya penerima yang dapat membaca pesan Anda. Pesan dienkripsi menggunakan kunci publik penerima dan didekripsi menggunakan kunci pribadi penerima.

Tanda tangan dapat Anda gunakan untuk memberi tahu penerima bahwa Anda telah membuat pesan dan itu tidak berubah selama transfer. Penandatanganan pesan dilakukan menggunakan kunci pribadi Anda. Penerima dapat menggunakan kunci publik Anda untuk memeriksa pesannya belum diubah.

Adapun algoritma yang digunakan: yang melibatkan fungsi satu arah lihat misalnya wikipedia . Salah satu yang pertama dari algoritma tersebut menggunakan bilangan prima besar tetapi lebih banyak fungsi satu arah telah ditemukan sejak itu.

Cari 'Bob', 'Alice' dan 'Mallory' untuk menemukan artikel pengantar di internet.


Bisakah Anda mengomentari kasus penggunaan saya? Saya ingin menggunakan kunci pribadi untuk mengenkripsi dan kunci publik untuk memungkinkan siapa saja dan siapa saja untuk mendekripsi.
mmcdole

1
Itu tidak benar bahwa semua enkripsi asimetris didasarkan pada bilangan prima, itu hanya contoh yang paling terkenal (RSA); ada metode lain seperti kriptografi kurva elips.
Michael Borgwardt

"Pesan dienkripsi lalu dienkripsi menggunakan kunci publik penerima." Kalimat itu tidak masuk akal, atau paling tidak butuh penjelasan lebih lanjut. "terenkripsi lalu terenkripsi" ???
Maarten Bodewes

Anda lupa Trent! :)
Dojo

1

Menjawab pertanyaan ini dalam konten yang maksud si penanya adalah menggunakan solusi untuk lisensi perangkat lunak, persyaratannya adalah:

  1. Tidak ada pihak ketiga yang dapat menghasilkan kunci lisensi dari penguraian aplikasi
  2. Konten kunci perangkat lunak tidak perlu aman
  3. Kunci perangkat lunak tidak dapat dibaca manusia

Digital Signature akan menyelesaikan masalah ini karena data mentah yang membuat kunci dapat ditandatangani dengan kunci pribadi yang membuatnya tidak dapat dibaca oleh manusia tetapi dapat diurai kodenya jika direkayasa ulang. Tetapi kunci privat aman yang berarti tidak ada yang akan dapat membuat lisensi untuk perangkat lunak Anda (yang intinya).

Ingat Anda tidak dapat mencegah orang yang terampil mengeluarkan kunci perangkat lunak pada produk Anda. Jadi jika mereka harus meretas setiap versi yang dirilis. Tetapi Anda benar-benar tidak ingin mereka dapat menghasilkan kunci baru untuk produk Anda yang dapat dibagikan untuk semua versi.

Python Dokumentasi PyNaCl memiliki contoh 'Digital Signature' yang akan sesuai dengan tujuannya. http://pynacl.readthedocs.org/en/latest/signing/

dan proyek penyebab NaCl untuk contoh C

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.