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?
sumber
f(key, message)
, sehinggaf(private, f(public, message)) === f(public, f(private, message)) === message
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:
sumber
Ada dua masalah yang berbeda tetapi terkait erat dalam membangun komunikasi yang aman
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.
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?
sumber
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.
sumber
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!).
sumber
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.
sumber
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.
sumber
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.
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.
Itu properti non-penolakan, yang dapat dicapai dengan menandatangani.
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.
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.
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.
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.
sumber
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)
sumber
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.
sumber
Menjawab pertanyaan ini dalam konten yang maksud si penanya adalah menggunakan solusi untuk lisensi perangkat lunak, persyaratannya adalah:
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
sumber