Bagaimana kunci publik memverifikasi tanda tangan?

173

Saya mencoba untuk mendapatkan pemahaman yang lebih baik tentang cara kerja kunci publik / pribadi. Saya mengerti bahwa pengirim dapat menambahkan tanda tangan digital ke dokumen menggunakan kunci pribadinya untuk mendapatkan hash dokumen, tetapi yang tidak saya mengerti adalah bagaimana kunci publik dapat digunakan untuk memverifikasi tanda tangan itu.

Pemahaman saya adalah bahwa kunci publik mengenkripsi, kunci pribadi mendekripsi ... adakah yang bisa membantu saya mengerti?

jcampos8782
sumber
3
Pertanyaan yang bagus :)
Suraj Jain
Saya tidak ingin menambahkan ini sebagai jawaban dan mempertaruhkan kobaran api berikutnya, tetapi jika Anda menggunakan kata "bagaimana" benar-benar berarti "bagaimana saya memverifikasi tanda tangan" maka satu kemungkinan adalah mengunduh gpg4win. Setelah diinstal, Anda dapat mengklik kanan file dan memverifikasinya. Ini adalah rangkaian produk yang terintegrasi ke dalam shell Windows. Salah satu utilitas tersebut adalah Kleopatra yang akan mencari sertifikat online untuk melakukan validasi.
Newclique

Jawaban:

210

Pemahaman Anda tentang "kunci publik mengenkripsi, mendekripsi kunci pribadi" benar ... untuk data / pesan ENCRYPTION. Untuk tanda tangan digital, ini adalah kebalikannya. Dengan tanda tangan digital, Anda mencoba membuktikan bahwa dokumen yang Anda tandatangani berasal dari Anda. Untuk melakukan itu, Anda perlu menggunakan sesuatu yang hanya ANDA miliki: kunci pribadi Anda.

Tanda tangan digital dalam deskripsi paling sederhana adalah hash (SHA1, MD5, dll.) Dari data (file, pesan, dll.) Yang kemudian dienkripsi dengan kunci pribadi penandatangan. Karena itu adalah sesuatu yang hanya dimiliki oleh penandatangan (atau yang seharusnya) di situlah kepercayaan berasal. SEMUA ORANG memiliki (atau seharusnya memiliki) akses ke kunci publik penandatangan.

Jadi, untuk memvalidasi tanda tangan digital, penerima

  1. Menghitung hash dari data yang sama (file, pesan, dll.),
  2. Dekripsi tanda tangan digital menggunakan kunci PUBLIK pengirim, dan
  3. Membandingkan 2 nilai hash.

Jika cocok, tanda tangan dianggap valid. Jika tidak cocok, itu berarti bahwa kunci yang berbeda digunakan untuk menandatanganinya, atau bahwa data telah diubah (baik sengaja atau tidak sengaja).

Semoga itu bisa membantu!

Manusia bayangan
sumber
13
Pemahaman saya adalah bahwa kunci tidak simetris ... yaitu, objek yang dienkripsi dengan kunci publik dapat didekripsi oleh kunci pribadi, tetapi hubungan ini tidak bekerja secara terbalik ... lebih khusus lagi, saya tidak berpikir objek dienkripsi dengan kunci pribadi dapat didekripsi oleh kunci publik. Jika memang demikian, maka ini pasti menjawab pertanyaan saya.
jcampos8782
63
Kunci-kunci itu bekerja secara terbalik satu sama lain. Mengenkripsi sesuatu dengan kunci publik Anda? Dekripsi dengan kunci pribadi Anda. Sebaliknya, jika Anda mengenkripsi sesuatu dengan kunci pribadi Anda, Anda mendekripsi dengan publik Anda. Begitulah sifat kriptografi asimetris.
Shadowman
20
Symmetric berarti bahwa kunci yang sama digunakan untuk mengenkripsi / mendekripsi. Asimetri berarti bahwa satu kunci mengenkripsi dan mendekripsi kunci yang berbeda (dan sebaliknya juga benar).
gtrig
8
@Jodimoro, Secara teknis pesan BUKAN "Rahasia" jika dienkripsi dengan kunci pribadi. Jika dienkripsi dengan kunci pribadi, siapa pun dengan kunci "publik" yang tersedia untuk umum dapat mendekripsi pesan tersebut.
Ray Tanpa Cinta
4
@Jodimoro Satu-satunya alasan hash dienkripsi dengan kunci pribadi menjadi tanda tangan adalah untuk memastikan hash tidak diubah ... bukan untuk memastikan itu "rahasia".
Ray Tanpa Cinta
72

Kunci-kunci itu bekerja secara terbalik:

Enkripsi kunci publik, dekripsi kunci pribadi (enkripsi):

openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt -out message.ssl
openssl rsautl -decrypt -inkey private.pem       -in message.ssl -out message.txt

Enkripsi kunci pribadi, dekripsi kunci publik (penandatanganan):

openssl rsautl -sign -inkey private.pem       -in message.txt -out message.ssl
openssl rsautl       -inkey public.pem -pubin -in message.ssl -out message.txt

Di bawah ini adalah contoh skrip untuk menguji keseluruhan alur ini openssl.

#!/bin/sh
# Create message to be encrypted
echo "Creating message file"
echo "---------------------"
echo "My secret message" > message.txt
echo "done\n"

# Create asymmetric keypair
echo "Creating asymmetric key pair"
echo "----------------------------"
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -pubout
echo "done\n"

# Encrypt with public & decrypt with private
echo "Public key encrypts and private key decrypts"
echo "--------------------------------------------"
openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt         -out message_enc_pub.ssl
openssl rsautl -decrypt -inkey private.pem       -in message_enc_pub.ssl -out message_pub.txt
xxd message_enc_pub.ssl # Print the binary contents of the encrypted message
cat message_pub.txt # Print the decrypted message
echo "done\n"

# Encrypt with private & decrypt with public
echo "Private key encrypts and public key decrypts"
echo "--------------------------------------------"
openssl rsautl -sign    -inkey private.pem -in message.txt          -out message_enc_priv.ssl
openssl rsautl -inkey public.pem -pubin    -in message_enc_priv.ssl -out message_priv.txt
xxd message_enc_priv.ssl
cat message_priv.txt
echo "done\n"

Script ini menghasilkan yang berikut:

Creating message file
---------------------
done

Creating asymmetric key pair
----------------------------
Generating RSA private key, 1024 bit long modulus
...........++++++
....++++++
e is 65537 (0x10001)
writing RSA key
done

Public key encrypts and private key decrypts
--------------------------------------------
00000000: 31c0 f70d 7ed2 088d 9675 801c fb9b 4f95  1...~....u....O.
00000010: c936 8cd0 0cc4 9159 33c4 9625 d752 5b77  .6.....Y3..%.R[w
00000020: 5bfc 988d 19fe d790 b633 191f 50cf 1bf7  [........3..P...
00000030: 34c0 7788 efa2 4967 848f 99e2 a442 91b9  4.w...Ig.....B..
00000040: 5fc7 6c79 40ea d0bc 6cd4 3c9a 488e 9913  [email protected].<.H...
00000050: 387f f7d6 b8e6 5eba 0771 371c c4f0 8c7f  8.....^..q7.....
00000060: 8c87 39a9 0c4c 22ab 13ed c117 c718 92e6  ..9..L".........
00000070: 3d5b 8534 7187 cc2d 2f94 0743 1fcb d890  =[.4q..-/..C....
My secret message
done

Private key encrypts and public key decrypts
--------------------------------------------
00000000: 6955 cdd0 66e4 3696 76e1 a328 ac67 4ca3  iU..f.6.v..(.gL.
00000010: d6bb 5896 b6fe 68f1 55f1 437a 831c fee9  ..X...h.U.Cz....
00000020: 133a a7e9 005b 3fc5 88f7 5210 cdbb 2cba  .:...[?...R...,.
00000030: 29f1 d52d 3131 a88b 78e5 333e 90cf 3531  )..-11..x.3>..51
00000040: 08c3 3df8 b76e 41f2 a84a c7fb 0c5b c3b2  ..=..nA..J...[..
00000050: 9d3b ed4a b6ad 89bc 9ebc 9154 da48 6f2d  .;.J.......T.Ho-
00000060: 5d8e b686 635f b6a4 8774 a621 5558 7172  ]...c_...t.!UXqr
00000070: fbd3 0c35 df0f 6a16 aa84 f5da 5d5e 5336  ...5..j.....]^S6
My secret message
done
Jaakko
sumber
2
Terima kasih telah menambahkan skrip - pasti membantu membersihkan semuanya.
Pat
Terima kasih banyak, selalu lebih mudah bagi saya untuk mengerti dengan ecample
Simon
16

Kunci publik mengenkripsi dan hanya kunci pribadi yang dapat mendekripsi, dan kebalikannya benar. Keduanya mengenkripsi hash yang berbeda tetapi masing-masing kunci dapat mendekripsi enkripsi yang lain.

Ada beberapa cara berbeda untuk memverifikasi bahwa pesan datang dari pengirim yang diharapkan. Sebagai contoh:

Pengirim mengirim:

  1. Pesan

  2. Hash pesan dienkripsi dengan kunci pribadi mereka

Penerima:

  1. Dekripsi tanda tangan (2) dengan kunci publik untuk mendapatkan pesan, seharusnya pesan yang sama dengan (1) tapi kami belum tahu. Kami sekarang memiliki dua pesan yang perlu kami verifikasi identik. Jadi untuk melakukan ini, kami akan mengenkripsi keduanya dengan kunci publik kami dan membandingkan dua hash. Jadi kami akan ....
  2. Enkripsi pesan asli (1) dengan kunci publik untuk mendapatkan hash
  3. Enkripsi pesan yang didekripsi (3) untuk mendapatkan hash kedua dan bandingkan dengan (4) untuk memverifikasi bahwa keduanya identik.

Jika mereka tidak identik itu berarti pesan itu diubah atau ditandatangani dengan beberapa kunci lain dan bukan yang kami pikir ...

Contoh lain adalah bagi pengirim untuk menggunakan hash yang umum bahwa penerima mungkin tahu untuk menggunakan juga. Sebagai contoh:

Pengirim mengirim:

  1. Sebuah pesan
  2. Mengambil hash yang diketahui dari pesan, lalu mengenkripsi hash dengan kunci pribadi

Penerima:

  1. Dekripsi (2) dan mendapat nilai hash
  2. Hash pesan (1) dengan hash yang sama yang digunakan oleh pengirim
  3. Membandingkan dua hash untuk memastikan mereka cocok

Ini lagi memastikan pesan tidak dirusak dan itu dari pengirim yang diharapkan.

wueb
sumber
6

Jika saya harus menyusun kembali pertanyaan Anda dari bagaimana saya memahaminya, Anda mengajukan yang berikut:

Jika kriptografi kunci publik memastikan bahwa kunci publik dapat diturunkan dari kunci privat, tetapi kunci privat tidak dapat diturunkan dari kunci publik, maka Anda mungkin bertanya-tanya, bagaimana kunci publik mendekripsi pesan yang ditandatangani dengan kunci pribadi tanpa pengirim mengekspos kunci pribadi dalam pesan yang ditandatangani kepada penerima? (baca kembali itu beberapa kali sampai masuk akal)

Jawaban lain telah menjelaskan bagaimana asimetris berarti kriptografi yang dapat Anda baik :

  1. Enkripsi dengan kunci publik, dekripsi dengan kunci pribadi yang cocok (pseudocode di bawah)
var msg = 'secret message';

var encryptedMessage = encrypt(pub_key, msg);

var decryptedMessage = decrypt(priv_key, encryptedMessage);

print(msg == decryptedMessage == 'secret message'); // True
  1. Enkripsikan dengan kunci pribadi, dekripsi dengan kunci publik yang cocok (pseudocode di bawah)
var msg = 'secret message';

var encryptedMessage = encrypt(priv_key, msg);

var decryptedMessage = decrypt(pub_key, encryptedMessage); // HOW DOES THIS WORK???

print(msg == decryptedMessage == 'secret message'); // True

Kita tahu bahwa kedua contoh # 1 dan # 2 berfungsi. Contoh # 1 masuk akal secara intuitif, sedangkan contoh # 2 meminta pertanyaan awal .

Ternyata, kriptografi kurva eliptik (juga disebut "perkalian kurva eliptik") adalah jawaban untuk pertanyaan awal. Kriptografi kurva elips adalah hubungan matematika yang memungkinkan kondisi berikut:

  1. Kunci publik dapat dihasilkan secara matematis dari kunci pribadi
  2. Kunci pribadi tidak dapat dibuat secara matematis dari kunci publik (yaitu "fungsi pintu jebakan")
  3. Kunci privat dapat dilakukan diverifikasi oleh kunci publik

Bagi sebagian besar, kondisi # 1 dan # 2 masuk akal, tetapi bagaimana dengan # 3?

Anda punya dua pilihan di sini:

  1. Anda bisa turun ke lubang kelinci dan menghabiskan berjam-jam mempelajari bagaimana kriptografi kurva eliptik bekerja (di sini adalah titik awal yang bagus ) ... ATAU ...
  2. Anda dapat menerima properti di atas - sama seperti Anda menerima 3 hukum gerak Newton tanpa harus menurunkannya sendiri.

Kesimpulannya, keypair publik / pribadi dibuat menggunakan kriptografi kurva eliptik, yang pada dasarnya, menciptakan kunci publik dan pribadi yang secara matematis terhubung di kedua arah, tetapi tidak secara matematis diturunkan di kedua arah . Inilah yang memungkinkan Anda menggunakan kunci publik seseorang untuk memverifikasi bahwa mereka menandatangani pesan tertentu, tanpa mereka membuka kunci pribadi mereka kepada Anda.

Zach Gollwitzer
sumber
3 kondisi Anda menjelaskan semuanya. Saya baru saja membaca istilah 'kurva elips' ini dan saya seperti wtf
Simon
5

Pikir saya akan memberikan penjelasan tambahan untuk siapa pun yang mencari sesuatu yang lebih intuitif mengungkapkan.

Sebagian besar kebingungan ini muncul dari penamaan 'kunci publik' dan 'kunci privat' karena bagaimana hal-hal ini benar-benar bekerja secara langsung bertentangan dengan bagaimana 'kunci' dipahami.

Ambil enkripsi misalnya. Dapat dianggap bekerja seperti ini:

  • Pihak-pihak yang ingin dapat membaca pesan rahasia masing-masing menyimpan kunci tersembunyi (yaitu kunci pribadi)
  • Pihak-pihak yang ingin dapat mengirim pesan rahasia semua memiliki kemampuan untuk mendapatkan terkunci terkunci (yaitu kunci publik)
  • Kemudian mengirim pesan rahasia semudah menguncinya dengan kunci yang tidak terkunci, tetapi membukanya setelah itu hanya dapat dilakukan dengan salah satu kunci yang disembunyikan.

Ini memungkinkan pesan rahasia dikirim antar pihak, tetapi dari sudut pandang intuitif di sini, 'kunci publik' adalah nama yang lebih cocok daripada 'kunci publik'.

Namun, untuk mengirim tanda tangan digital perannya agak terbalik:

  • Pihak yang ingin menandatangani pesan adalah satu-satunya yang memiliki akses ke kunci yang tidak terkunci (yaitu kunci pribadi)
  • Pihak-pihak yang ingin memverifikasi tanda tangan semua memiliki kemampuan untuk mendapatkan kunci (yaitu kunci publik)
  • Lalu apa yang dilakukan penanda tangan adalah membuat dua pesan yang identik: satu yang dapat dibaca siapa saja dan satu untuk menyertainya, tetapi yang dikunci dengan salah satu kunci pribadi mereka.
  • Kemudian ketika penerima menerima pesan, mereka dapat membacanya, dan kemudian menggunakan kunci publik untuk membuka kunci pesan yang terkunci dan membandingkan dua pesan. Jika pesannya sama, maka mereka tahu bahwa:

    1. Pesan yang dibuka tidak dirusak selama perjalanan dan,

    2. Pesan harus berasal dari orang yang memiliki kunci yang cocok untuk kunci publik mereka.

  • Dan akhirnya, seluruh sistem ini hanya berfungsi jika ada orang yang ingin memvalidasi tanda tangan penanda tangan memiliki tempat otoritatif untuk pergi untuk mendapatkan kunci yang cocok dengan kunci tanda tangan. Kalau tidak, siapa pun dapat mengatakan "Hei, inilah kunci untuk kunci pribadi ini-dan-begitu", mengirimi Anda pesan berpura-pura menjadi mereka tetapi menguncinya dengan kunci pribadi mereka, Anda melakukan semua langkah di atas dan percaya bahwa pesan tersebut harus benar-benar dari orang yang Anda pikir, tetapi Anda dibodohi karena Anda menyesatkan pemilik kunci publik yang sebenarnya.

Selama ada sumber yang layak dipercaya untuk mengambil kunci publik penandatangan, Anda akan tahu siapa pemilik kunci publik yang sah, dan akan dapat memvalidasi tanda tangan mereka.

sepatu
sumber
4
Mengubah 'kunci' menjadi 'membuka kunci' hanya menambah kebingungan.
Marquis of Lorne
@ EJP Saya tidak mengubah kunci untuk 'membuka kunci'. Itu berubah menjadi 'mengunci'. 'Terkunci tidak terkunci' hanya digunakan untuk tujuan mengekspresikan penggunaan item. Mengenai, itulah pendapat Anda, dan jika Anda memiliki pengalaman jangka panjang dalam komunitas kripto, kemungkinan besar sangat bias karena istilah yang ada adalah bagaimana Anda telah tumbuh untuk memahami teknologi. Mengapa Anda tidak membiarkan orang yang baru mulai menentukan apakah analogi itu bermanfaat atau tidak?
sepatu
1
Saya pikir analogi dengan kunci dan kunci cukup baik untuk memberikan pemahaman pertama tentang masalah ini. Setelah Anda memvisualisasikan kunci dan kunci, mereka dapat ditukar bilangan bulat yang berbeda yang dirakit menjadi kunci rsa (atau jenis lainnya).
Andreas Lundgren
Saya pribadi berpikir wawasan ini adalah yang terbaik, saya sudah baca sejauh ini. Dan tentu saja melihat bagaimana menambahkan kunci alih-alih kunci ke privat / publik membuat seluruh sistem secara intuitif cukup jelas untuk pendatang baru reguler. Sementara saat ini tidak sama sekali. Kami adalah devs berpengalaman (hanya tanpa sentuhan langsung ke crypto sampai sekarang) dan kami berdebat tentang tujuan publik / pribadi untuk beberapa waktu. Saya mengatakan bahwa privat digunakan untuk mengenkripsi, sementara dia mengatakan bahwa publik digunakan untuk mengenkripsi: D
jayarjo
0

Untuk pertanyaan Anda - saya melihat implementasi RSA. Dan mendapatkan kejelasan lebih lanjut tentang cara kunci publik digunakan untuk memverifikasi tanda tangan menggunakan kunci pribadi. Tidak diragukan lagi, kunci pribadi tidak terbuka. Begini caranya ...

Trik di sini adalah menyembunyikan kunci pribadi dalam suatu fungsi. Pada kasus ini,(p-1)*(q-1).

Anggap p sebagai kunci privat dan e sebagai kunci publik. 'p' diringkas dalam fungsi lain untuk membuatnya tersembunyi.

E.g., `d = (p-1)(q-1); d * e = 1` (d is the inverse of e - public key)

Data terkirim = [terenkripsi (hash), pesan] = [m ^ d, pesan]; di mana m adalah pesan Misalkan 'Data terkirim' = y Untuk memeriksa integritas kita menemukan y ^ e untuk mendapatkan m. Sejakm ^(d*e) = m ^1 = m .

Semoga ini membantu! :)

George John
sumber