Ortak anahtar bir imzayı nasıl doğrular?


173

Genel / özel anahtarların nasıl çalıştığı konusunda daha iyi bir kavrayış elde etmeye çalışıyorum. Bir gönderenin, belgenin bir karmasını esas olarak elde etmek için özel anahtarını kullanarak bir belgeye dijital imza ekleyebileceğini anlıyorum, ancak anlamadığım şey, ortak anahtarın bu imzayı doğrulamak için nasıl kullanılabileceğidir.

Anladığım kadarıyla, ortak anahtarlar şifrelendi, özel anahtarların şifresi çözüldü ... kimse anlamama yardımcı olabilir mi?


3
Güzel soru. :)
Suraj Jain

Bunu bir cevap olarak eklemek istemedim ve ardından gelen alevleri riske attı, ancak "nasıl" gerçekten "imzayı nasıl doğrularım" kelimesini kullanıyorsanız o zaman bir olasılık gpg4win'i indirmektir. Yüklendikten sonra, bir dosyayı sağ tıklayıp doğrulayabilirsiniz. Windows kabuğuna entegre olan bir ürün paketidir. Böyle bir yardımcı program, doğrulama yapmak için çevrimiçi sertifikaları arayacak Kleopatra'dır.
Newclique

Yanıtlar:


210

"Ortak anahtar şifreleme, özel anahtar şifresini çözme" anlayışınız doğru ... veri / mesaj ŞİFRESİ için. Dijital imzalar için bunun tersi geçerlidir. Dijital imza ile imzaladığınız belgenin sizden geldiğini kanıtlamaya çalışıyorsunuz. Bunu yapmak için, sadece SİZİN sahip olduğunuz bir şeyi kullanmanız gerekir: özel anahtarınız.

En basit açıklamasındaki dijital imza, daha sonra imzalayanın özel anahtarıyla şifrelenen verilerin (dosya, mesaj vb.) Bir karmasıdır (SHA1, MD5, vb.). Bu sadece imzacının güvenin geldiği yer olduğu (veya olması gereken) bir şey olduğu için. HERKES, imzalayanın ortak anahtarına erişebilir (veya sahip olmalıdır).

Bu nedenle, dijital imzayı doğrulamak için alıcı

  1. Aynı verilerin (dosya, mesaj vb.) Bir karmasını hesaplar,
  2. Gönderenin PUBLIC anahtarını kullanarak dijital imzanın şifresini çözer ve
  3. 2 karma değerini karşılaştırır.

Eşleşirlerse imza geçerli sayılır. Eşleşmezlerse, bu, onu imzalamak için farklı bir anahtarın kullanıldığı veya verilerin değiştirildiği anlamına gelir (kasıtlı veya kasıtsız).

Umarım yardımcı olur!


13
Anladığım kadarıyla, anahtarlar simetrik değildi ... yani, ortak bir anahtarla şifrelenen nesnelerin özel anahtarla şifresi çözülebiliyordu, ancak bu ilişkinin ters bir şekilde çalışmadığı ... daha spesifik olarak, nesneleri düşünmedim özel anahtarla şifrelenmiş açık anahtarla şifresi çözülebilir. Gerçekten durum buysa, bundan kesinlikle soruma cevap verir.
jcampos8782

63
Anahtarlar birbirine ters çalışır. Ortak anahtarınızla bir şey mi şifrelediniz? Özel anahtarınızla şifresini çözün. Tersine, özel anahtarınızla bir şey şifrelediyseniz, şifrenizi şifrenizle paylaşırsınız. Asimetrik kriptografinin doğası budur.
Shadowman

20
Simetrik, aynı anahtarın şifrelemek / şifresini çözmek için kullanıldığı anlamına gelir. Asimetrik, bir anahtarın ve farklı bir anahtarın şifresini çözdüğü anlamına gelir (ve bunun tersi de doğrudur).
gtrig

8
@Jodimoro, Teknik olarak özel bir anahtarla şifrelenmiş bir mesaj "Gizli" DEĞİLDİR. Özel bir anahtarla şifrelenmişse, genel kullanıma açık "genel" anahtarı olan herkes iletinin şifresini çözebilir.
RayLoveless

4
@Jodimoro Karma özel bir anahtarla imzanın içine şifrelenmesinin tek nedeni, karma değerinin değiştirilmediğinden emin olmaktır ... "gizli" olduğundan emin olmamaktır.
RayLoveless

73

Anahtarlar ters çalışır:

Ortak anahtar şifreleme, özel anahtar şifre çözme (şifreleme):

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

Özel anahtar şifreleme, genel anahtar şifre çözme (imzalama):

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

Aşağıda bu akışın tamamını test etmek için örnek bir komut dosyası verilmiştir 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"

Bu komut dosyası aşağıdakileri verir:

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  _.ly@...l.<.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

2
Senaryo eklediğiniz için teşekkürler - kesinlikle net şeyler yardımcı oldu.
Pat

Çok teşekkürler, örnekle anlamak benim için her zaman daha kolay
Simon

16

Ortak anahtar şifrelenir ve yalnızca özel anahtar şifresini çözebilir ve bunun tersi de geçerlidir. Her ikisi de farklı karmaları şifreliyor, ancak her anahtar diğerinin şifrelemesinin şifresini çözebiliyor.

Beklenen bir gönderenden gelen bir iletinin geldiğini doğrulamanın birkaç farklı yolu vardır. Örneğin:

Gönderen şunları gönderir:

  1. Mesaj

  2. Özel anahtarıyla şifrelenmiş mesajın karması

Alıcı:

  1. Bir mesaj almak için genel anahtar ile imzanın (2) şifresini çözer, sözde (1) ile aynı mesajdır, ancak henüz bilmiyoruz. Şimdi aynı olduğunu doğrulamamız gereken iki mesajımız var. Bunu yapmak için, onları hem ortak anahtarımızla şifreleyeceğiz hem de iki karmayı karşılaştıracağız. O zaman yapacağız ....
  2. Bir karma elde etmek için orijinal mesajı (1) ortak anahtarla şifreleyin
  3. Şifrelenmiş mesajı (3) ikinci bir kare elde etmek için şifreleyin ve aynı olduklarını doğrulamak için (4) ile karşılaştırın.

Aynı değilse, mesajın kurcalandığı veya başka bir anahtarla imzalandığı anlamına gelir, düşündüğümüzle değil ...

Başka bir örnek, gönderenin alıcının da kullanabileceği ortak bir karma kullanmasıdır. Örneğin:

Gönderen şunları gönderir:

  1. Bir mesaj
  2. İletinin bilinen bir karmasını alır, ardından karmayı özel anahtarla şifreler

Alıcı:

  1. Şifre çözer (2) ve bir karma değer alır
  2. İletiyi (1) gönderen tarafından kullanılan aynı karma değeriyle karma yapar
  3. Eşleştiğinden emin olmak için iki karmayı karşılaştırır

Bu, iletinin kurcalanmamasını ve beklenen gönderenden gelmesini sağlar.


6

Sorunuzu nasıl anladığımdan tekrar ifade etmek zorunda kalsaydım, aşağıdakileri soruyorsunuz:

Bir açık anahtar olduğu genel anahtar şifreleme olmasını sağlar Eğer edebilir bir özel anahtar elde edilebilir, ancak özel anahtar olamaz bir genel anahtar elde edilebilir, o zaman merak edebilirsiniz, nasıl bir ortak anahtar olabilir şifresini bir mesaj gönderene almadan özel anahtarla imzalanmış imzalı mesajdaki özel anahtarı alıcıya ifşa etmek? (mantıklı olana kadar birkaç kez tekrar okuyun)

Diğer cevaplar, asimetrik kriptografinin aşağıdakilerden birini yapmanın ne anlama geldiğini zaten açıkladı :

  1. Genel anahtarla şifrele, eşleşen özel anahtarla şifreyi çöz (aşağıda pseudocode)
var msg = 'secret message';

var encryptedMessage = encrypt(pub_key, msg);

var decryptedMessage = decrypt(priv_key, encryptedMessage);

print(msg == decryptedMessage == 'secret message'); // True
  1. Özel anahtarla şifrele, eşleşen ortak anahtarla şifreyi çöz (aşağıda pseudocode)
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

Biz biliyoruz o örnek # hem 1 hem de 2. çalışmalarını. Örnek 1, sezgisel bir anlam ifade ederken, örnek # 2 orijinal soruya yalvarır .

Görünen o ki, eliptik eğri şifreleme ("eliptik eğri çarpımı" olarak da bilinir) orijinal sorunun cevabıdır. Eliptik eğri kriptografisi, aşağıdaki koşulları mümkün kılan matematiksel ilişkidir:

  1. Bir ortak anahtar , özel bir anahtardan matematiksel olarak oluşturulabilir
  2. Özel anahtar olamaz matematiksel olarak bir genel anahtar üretilebilir (yani, "kapaklı kapılı fonksiyonu"),
  3. Bir özel anahtar olabilir edilmesi doğrulanmış bir kamu anahtar ile

Çoğunlukla, # 1 ve # 2 koşulları mantıklı, ama # 3?

Burada iki seçeneğiniz var:

  1. Bir tavşan deliğinden aşağı inebilir ve eliptik eğri kriptografisinin nasıl çalıştığını öğrenmek için saatlerce saatler geçirebilirsiniz ( işte harika bir başlangıç ​​noktası ) ... VEYA ...
  2. Yukarıdaki özellikleri kabul edebilirsiniz - tıpkı Newton'un 3 hareket yasasını kendiniz türetmek zorunda kalmadan kabul ettiğiniz gibi .

Sonuç olarak, eliptik eğri kriptografisi kullanılarak bir genel / özel anahtar çifti yaratılır; bu , doğası gereği, her iki yönde de matematiksel olarak birbirine bağlı , ancak her iki yönde de matematiksel olarak türetilmemiş bir genel ve özel anahtar oluşturur . Özel anahtarını size göstermeden belirli bir iletiyi imzaladıklarını doğrulamak için birinin ortak anahtarını kullanmanızı mümkün kılan da budur.


3 koşulunuz her şeyi açıklıyor. Ben sadece wtf gibiydim bu terme 'eliptik eğri' ve okudum
Simon

5

Daha sezgisel olarak açıklayıcı bir şey arayan herkes için ek bir açıklama sağlayacağımı düşündüm.

Bu karışıklığın büyük bir kısmı, 'ortak anahtarlar' ve 'özel anahtarlar' olarak adlandırılmasından kaynaklanır, çünkü bu şeylerin gerçekte nasıl çalıştığı, bir 'anahtarın' nasıl anlaşıldığı ile doğrudan tutarlıdır.

Örneğin şifrelemeyi ele alalım. Bunun gibi çalıştığı düşünülebilir:

  • Gizli mesajları okuyabilmek isteyen tarafların her biri bir anahtarı gizli tutar (yani özel bir anahtar)
  • Gizli mesajlar göndermek isteyen tarafların hepsi kilitli kilitli (yani açık kilitli) elde etme yeteneğine sahiptir.
  • Daha sonra gizli bir mesaj göndermek, kilidi açık bir kilitle kilitlemek kadar kolaydır, ancak daha sonra kilidini açmak sadece gizli tuşlardan biriyle yapılabilir.

Bu, taraflar arasında gizli mesajların gönderilmesine izin verir, ancak burada sezgisel bir bakış açısıyla, 'genel kilit', 'genel anahtardan' daha uygun bir addır.

Ancak, dijital imza göndermek için roller bir şekilde tersine çevrilir:

  • Mesajları imzalamak isteyen taraf, kilidi açılan kilitlere erişimi olan (yani özel bir kilit)
  • İmzayı doğrulamak isteyen tarafların hepsi bir anahtar (örneğin bir ortak anahtar) elde etme yeteneğine sahiptir.
  • İmzacının yaptığı iki özdeş mesaj oluşturmaktır: herkesin okuyabileceği ve ona eşlik etmesi için bir tane, ancak özel kilitlerinden biriyle kilitledikleri.
  • Ardından alıcı mesajı aldığında okuyabilir ve kilitli mesajın kilidini açmak ve iki mesajı karşılaştırmak için ortak anahtarı kullanabilir. Mesajlar aynıysa, şunu bilirler:

    1. Kilitli mesaj seyahat sırasında değiştirilmedi ve

    2. Mesaj, ortak anahtarıyla eşleşen kilidi olan kişiden gelmiş olmalıdır.

  • Ve son olarak, bu tüm sistem sadece bir imza sahibinin imzasını doğrulamak isteyen herkesin imzalayan kişinin kilitleriyle eşleşen anahtarı almak için gidecek yetkili bir yeri varsa çalışır. Aksi takdirde, herkes "Hey, işte bu yüzden özel kilit için anahtar" diyebilir, onlar gibi davranan bir mesaj gönderebilir, ancak özel kilitleriyle kilitleyebilir, yukarıdaki tüm adımları uygular ve mesajın gerçekten olması gerektiğine inanırsınız. düşündüğünüz kişiden, ancak kandırıldınız çünkü ortak anahtarın gerçek sahibine yanlış yönlendirildiniz.

İmza sahibinin ortak anahtarını almak için güvene değer bir kaynak olduğu sürece, ortak anahtarın haklı sahibinin kim olduğunu bilecek ve imzalarını doğrulayabileceksiniz.


4
'Anahtar'ın' kilitli kilit 'olarak değiştirilmesi sadece karışıklığa neden olur.
Lorne Marquis

@EJP Anahtarı 'kilit açık kilit' olarak değiştirmiyorum. 'Kilit' olarak değiştirildi. 'Kilidi açık kilitli' sadece ürünün kullanımını ifade etmek için kullanılır. Saygılarımızla, bu sizin görüşünüzdür ve kripto topluluğunda uzun vadeli bir deneyime sahipseniz, muhtemelen son derece önyargılıdır, çünkü mevcut terimler teknolojiyi nasıl anladığınızdır. Neden yeni başlayan kişilerin benzetmenin faydalı olup olmadığını belirlemelerine izin vermiyorsunuz?
ayakkabı

1
Bence kilitler ve anahtarlarla analoji bu konuyu ilk kez anlamak için oldukça iyi. Kilitleri ve anahtarları görselleştirdikten sonra, rsa (veya başka tür) anahtarlara monte edilmiş farklı tamsayılarla değiştirilebilir.
Andreas Lundgren

Ben şahsen bu anlayış en iyisi olduğunu düşünüyorum, şimdiye kadar okudum. Ve kesinlikle özel / kamu için anahtar yerine kilit eklemenin tüm sistemi düzenli yeni gelenler için sezgisel olarak nasıl açıklayıcı hale getirdiğini görün. Şu anda hiç de değil. Terbiyeli geliştiricileriz (şimdiye kadar kriptoya doğrudan dokunmadan) ve bir süredir kamu / özel amaçlarını tartıştık. Halkın şifrelemek için kullanıldığını
söylerken özelin

0

Sorunuza - RSA uygulamasına bakıyordum. Ve özel bir anahtar kullanarak imzayı doğrulamak için bir ortak anahtarın nasıl kullanıldığı konusunda daha fazla netlik elde edin. Kuşkusuz, özel anahtar gösterilmez. İşte böyle ...

Buradaki hile, bir işlevi içindeki özel anahtarı gizlemektir. Bu durumda,(p-1)*(q-1).

P'yi özel anahtar, e'yi ortak anahtar olarak düşünün. 'p' başka bir işlev içinde gizli hale getirilir.

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

Gönderilen veriler = [şifreli (karma), mesaj] = [m ^ d, mesaj]; burada m 'Gönderilen veriler' = y Diyelim ki bütünlüğü kontrol etmek için m almak için y ^ e buluyoruz. Beri m ^(d*e) = m ^1 = m.

Bu yardımcı olur umarım! :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.