it-swarm-id.com

Bisakah saya menggunakan kunci pribadi sebagai kunci publik dan sebaliknya?

Saya memiliki kode untuk mengenkripsi data menggunakan kunci publik dan mendekripsi menggunakan kunci pribadi. Ini berguna ketika klien ingin mengirim data ke server dan tahu bahwa hanya server yang dapat mendekripsi itu.

Tetapi katakan saya ingin server untuk mengenkripsi data menggunakan kunci pribadi dan mendekripsi menggunakan kunci publik, sebagai cara mendistribusikan data yang dapat diverifikasi berasal dari server yang tepat. Daripada mengubah kode untuk mengizinkan ini, dapatkah saya cukup mempublikasikan kunci privat dan merahasiakan kunci publik? Apakah ini mempengaruhi keamanan sistem?

39
Graeme Perrow

Tetapi katakan saya ingin server untuk mengenkripsi data menggunakan kunci pribadi dan mendekripsi menggunakan kunci publik, sebagai cara mendistribusikan data yang dapat diverifikasi berasal dari server yang tepat.

Anda dapat melakukan ini - ini, pada tingkat yang sangat sederhana, cara kerja penandatanganan RSA (catatan, sederhana - ada sedikit lebih banyak).

Daripada mengubah kode untuk mengizinkan ini, dapatkah saya cukup mempublikasikan kunci privat dan merahasiakan kunci publik? Apakah ini mempengaruhi keamanan sistem?

Anda tidak perlu menerbitkan kunci pribadi sama sekali - RSA adalah permutasi Trapdoor yang berarti:

  • Jika Anda mengenkripsi dengan kunci publik, Anda dapat mendekripsi dengan kunci pribadi.
  • Jika Anda mengenkripsi dengan kunci pribadi, Anda dapat mendekripsi dengan kunci publik.

Dengan demikian, RSA mendukung melakukan penandatanganan dan enkripsi dengan mengandalkan pengguna akhir yang hanya memiliki kunci publik.

Dalam kasus Anda, jika klien ingin memverifikasi data berasal dari server, Anda menerapkan kasus RSA kedua dan mendekripsi data tanda tangan menggunakan kunci publik yang sudah Anda miliki.

Selain itu, karena ini adalah permutasi, Anda tidak perlu memodifikasi kode sama sekali. Kedua tombol harus bekerja menggunakan fungsi yang sama. Saya berharap perpustakaan crypto yang layak akan memiliki API untuk memverifikasi tanda tangan sesuai dengan berbagai standar yang ada - salah satunya mungkin akan menjadi taruhan yang baik.

RSA Labs menyediakan Nice penjelasan tentang ini .

Jika Anda ingin memperluas ini di antara server, atau memverifikasi komunikasi klien - buat kunci untuk setiap entitas dan tukar yang publik. Proses ini kemudian dapat digunakan di kedua ujungnya.

Secara teoritis, e dan d dapat dipertukarkan (itulah sebabnya RSA berfungsi) (kita harus ditunjuk sebagai rahasia dan dirahasiakan) tetapi p dan q harus selalu menjadi dirahasiakan karena ini memungkinkan Anda untuk menurunkan d dari e dan sebaliknya. Namun, Anda harus sangat berhati-hati dalam memahami kunci privat - apakah perangkat lunak Anda menyimpan p/q di kunci privat? Jika demikian, Anda tidak dapat menerbitkannya apa adanya. Juga, ketika saya mengatakan dipertukarkan - setelah Anda menerbitkan salah satu dari pasangan itu (e atau d bersama modulus Anda n), Anda harus menjaga yang lain dengan hidup Anda. Praktisnya berbicara seperti Graeme ditautkan dalam komentar e sering dipilih sebagai nilai kecil/tetap. Komentar saya tentang e/d dapat dipertukarkan dengan jelas tidak berlaku ketika e mudah ditentukan. Karena itu, melakukan hal semacam ini berpotensi menimbulkan kebingungan dan kesalahan implementasi. Gunakan perpustakaan pihak ketiga/jangan mulai menerbitkan kunci pribadi.

51
user2213

Ya, Anda dapat mengenkripsi menggunakan kunci pribadi dan mendekripsi menggunakan kunci publik, JANGAN membagikan kunci pribadi Anda (kunci pribadi dapat menghasilkan kunci publik, dan seluruh sistem enkripsi Anda sekarang tidak berguna), saya berasumsi Anda ingin melakukan sesuatu seperti ini:

Server mengenkripsi data, mengirimkannya ke klien.

Klien memiliki kunci publik, dan dapat mendekripsi data dari server.

Dalam keadaan ini, akan masuk akal, jika server melakukan enkripsi dan dekripsi, saya tidak tahu mengapa Anda ingin implementasi kripto asimetris.

Namun aturan selalu berlaku: kunci pribadi tetap pribadi dan tidak meninggalkan server.

9
StrangeWill

Tetapi katakan saya ingin server mengenkripsi data menggunakan kunci pribadi dan mendekripsi menggunakan kunci publik:

Server dapat mengenkripsi data menggunakan kunci privasinya dan penerima dapat mendekripsi menggunakan kunci publik server, ini dimungkinkan. Namun, skenario ini digunakan untuk menandatangani dokumen secara digital dan seperti yang Anda katakan "cara mendistribusikan data yang dapat diverifikasi berasal dari server yang tepat", karena hanya kunci yang sesuai (kunci publik dari server) yang dapat digunakan untuk mendekripsi data. Kunci publik dari server diverifikasi oleh sertifikat digital yang sesuai yang dihasilkan dan ditandatangani secara digital oleh server.

dapatkah saya cukup mempublikasikan kunci pribadi dan merahasiakan kunci publik?

Anda tidak boleh menerbitkan kunci pribadi, seperti namanya.

Apakah ini mempengaruhi keamanan sistem?

Ya, juga sistem ini tidak layak, misalnya, jika Anda menggunakan Diffie-Hellman (salah satu protokol pertukaran kunci yang paling banyak digunakan), server dan semua klien harus berbagi nilai publik, yang digunakan untuk menghitung kunci sesi . Jadi jika Anda sebagai pengguna menerbitkan kunci pribadi Anda, sangat mudah untuk menghitung kunci publik, yang tidak mungkin atau sangat sulit sebaliknya.

2
Ishtiaq Hussain

Saya tidak tahu apakah Anda bisa mengenkripsi dengan kunci pribadi dan mendekripsi dengan kunci publik, tetapi jika Anda bisa, itu tidak akan sangat aman, karena kunci dekripsi adalah publik - kunci pribadi Anda harus dirahasiakan.

Jika Anda hanya ingin memverifikasi bahwa pengirim pesan, maka Anda menandatangani data menggunakan kunci pribadi pengirim, dan penerima memverifikasi tanda tangan menggunakan kunci publik pengirim.

Jika Anda ingin mengenkripsi data dan memverifikasi pengirim, Anda mengenkripsi dan menandatangani, yang keduanya tidak memerlukan pengungkapan kunci pribadi.

0
hmallett