W jaki sposób klucz publiczny weryfikuje podpis?

172

Próbuję lepiej zrozumieć, jak działają klucze publiczne / prywatne. Rozumiem, że nadawca może dodać podpis cyfrowy do dokumentu, używając swojego klucza prywatnego, aby zasadniczo uzyskać skrót dokumentu, ale nie rozumiem, jak można użyć klucza publicznego do zweryfikowania tego podpisu.

Zrozumiałem, że klucze publiczne szyfrują, klucze prywatne odszyfrowują ... czy ktoś może mi pomóc to zrozumieć?

jcampos8782
źródło
3
Fajne pytanie. :)
Suraj Jain
Nie chciałem dodawać tego jako odpowiedzi i ryzykować pożarów, ale jeśli używasz słowa „jak” naprawdę oznacza „jak zweryfikować podpis”, jedną z możliwości jest pobranie gpg4win. Po zainstalowaniu możesz kliknąć plik prawym przyciskiem myszy i zweryfikować go. Jest to zestaw produktów, które integrują się z powłoką systemu Windows. Jednym z takich narzędzi jest Kleopatra, która wyszuka certyfikaty online, aby przeprowadzić walidację.
Newclique

Odpowiedzi:

210

Twoje rozumienie pojęcia „szyfrowanie kluczy publicznych, odszyfrowywanie kluczy prywatnych” jest poprawne ... dla SZYFROWANIA danych / wiadomości. W przypadku podpisów cyfrowych jest odwrotnie. Za pomocą podpisu cyfrowego próbujesz udowodnić, że podpisany przez Ciebie dokument pochodzi od Ciebie. Aby to zrobić, musisz użyć czegoś, co tylko TY masz: swojego klucza prywatnego.

Podpis cyfrowy w najprostszym opisie to skrót (SHA1, MD5 itd.) Danych (pliku, wiadomości itp.), Który jest następnie szyfrowany za pomocą klucza prywatnego osoby podpisującej. Ponieważ jest to coś, co tylko podpisujący ma (lub powinien mieć), stąd pochodzi zaufanie. KAŻDY ma (lub powinien mieć) dostęp do klucza publicznego sygnatariusza.

Tak więc, aby zweryfikować podpis cyfrowy, odbiorca

  1. Oblicza hash tych samych danych (plik, wiadomość itp.),
  2. Odszyfrowuje podpis cyfrowy przy użyciu klucza PUBLICZNEGO nadawcy i
  3. Porównuje 2 wartości skrótu.

Jeśli pasują, podpis jest uważany za ważny. Jeśli się nie zgadzają, oznacza to, że do podpisania użyto innego klucza lub że dane zostały zmienione (celowo lub nieumyślnie).

Mam nadzieję, że to pomoże!

Człowiek cień
źródło
13
Zrozumiałem, że klucze nie były symetryczne ... to znaczy obiekty zaszyfrowane kluczem publicznym można odszyfrować za pomocą klucza prywatnego, ale ta relacja nie działa odwrotnie ... a dokładniej, nie sądziłem, że obiekty zaszyfrowane za pomocą klucza prywatnego można odszyfrować za pomocą klucza publicznego. Jeśli tak jest, to zdecydowanie odpowiada na moje pytanie.
jcampos8782
63
Klawisze działają względem siebie odwrotnie. Zaszyfrowałeś coś swoim kluczem publicznym? Odszyfruj go za pomocą klucza prywatnego. I odwrotnie, jeśli zaszyfrowałeś coś swoim kluczem prywatnym, odszyfrujesz to swoim publicznym. Taka jest natura kryptografii asymetrycznej.
Shadowman,
20
Symetryczny oznacza po prostu, że ten sam klucz jest używany do szyfrowania / odszyfrowywania. Asymetryczny oznacza, że ​​jeden klucz szyfruje, a inny odszyfrowuje (i odwrotność jest również prawdą).
gtrig,
8
@Jodimoro, Technicznie rzecz biorąc, wiadomość NIE jest „tajna”, jeśli jest zaszyfrowana kluczem prywatnym. Jeśli wiadomość jest zaszyfrowana kluczem prywatnym, każdy z publicznie dostępnym kluczem „publicznym” może odszyfrować wiadomość.
RayLoveless
4
@Jodimoro Jedynym powodem, dla którego hash jest szyfrowany kluczem prywatnym w podpisie, jest zapewnienie, że hash nie zostanie zmieniony ... a nie upewnienie się, że jest „tajny”.
RayLoveless
71

Klawisze działają odwrotnie:

Szyfruje klucz publiczny, deszyfruje klucz prywatny (szyfrowanie):

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

Szyfruje klucz prywatny, odszyfrowuje klucz publiczny (podpis):

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

Poniżej znajduje się przykładowy skrypt do przetestowania całego przepływu 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"

Ten skrypt wyświetla następujące informacje:

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
źródło
2
Dzięki za dodanie scenariusza - zdecydowanie pomogło to wyjaśnić.
Pat
Wielkie dzięki, zawsze łatwiej jest mi to zrozumieć dzięki przykładowi
Simon
16

Klucz publiczny szyfruje i tylko klucz prywatny może go odszyfrować, i jest odwrotnie. Obaj szyfrują do różnych skrótów, ale każdy klucz może odszyfrować szyfrowanie drugiego.

Istnieje kilka różnych sposobów sprawdzenia, czy wiadomość pochodzi od określonego nadawcy. Na przykład:

Nadawca wysyła:

  1. Wiadomość

  2. Skrót wiadomości zaszyfrowany ich kluczem prywatnym

Odbiornik:

  1. Odszyfrowuje podpis (2) za pomocą klucza publicznego w celu uzyskania wiadomości, podobno tej samej wiadomości co (1), ale jeszcze nie wiemy. Mamy teraz dwie wiadomości, które musimy zweryfikować, są identyczne. Aby to zrobić, zaszyfrujemy je oba naszym kluczem publicznym i porównamy oba skróty. Więc będziemy ....
  2. Zaszyfruj oryginalną wiadomość (1) kluczem publicznym, aby uzyskać skrót
  3. Zaszyfruj odszyfrowaną wiadomość (3), aby uzyskać drugi skrót i porównaj z (4), aby sprawdzić, czy są identyczne.

Jeśli nie są identyczne, oznacza to, że wiadomość została zmodyfikowana lub została podpisana innym kluczem, a nie tym, o którym myśleliśmy ...

Innym przykładem może być użycie przez nadawcę wspólnego skrótu, którego może również używać odbiorca. Na przykład:

Nadawca wysyła:

  1. Wiadomość
  2. Pobiera znany skrót wiadomości, a następnie szyfruje go kluczem prywatnym

Odbiornik:

  1. Odszyfrowuje (2) i pobiera wartość skrótu
  2. Haszuje wiadomość (1) tym samym hashem używanym przez nadawcę
  3. Porównuje dwa skróty, aby upewnić się, że są zgodne

To znowu gwarantuje, że wiadomość nie została zmieniona i pochodzi od oczekiwanego nadawcy.

wueb
źródło
6

Gdybym musiał przeformułować twoje pytanie na podstawie tego, jak je rozumiem, zadajesz następujące pytania:

Jeśli kryptografia klucza publicznego zapewnia, że ​​klucz publiczny można uzyskać z klucza prywatnego, ale klucza prywatnego nie można uzyskać z klucza publicznego, możesz się zastanawiać, w jaki sposób klucz publiczny może odszyfrować wiadomość podpisaną kluczem prywatnym bez nadawcy ujawnienie klucza prywatnego w podpisanej wiadomości odbiorcy? (przeczytaj to kilka razy, aż będzie to miało sens)

Inne odpowiedzi zostały już wyjaśnione jak asymetryczne środki kryptograficzne, które można albo :

  1. Szyfruj kluczem publicznym, odszyfruj pasującym kluczem prywatnym (pseudokod poniżej)
var msg = 'secret message';

var encryptedMessage = encrypt(pub_key, msg);

var decryptedMessage = decrypt(priv_key, encryptedMessage);

print(msg == decryptedMessage == 'secret message'); // True
  1. Szyfruj kluczem prywatnym, odszyfruj pasującym kluczem publicznym (pseudokod poniżej)
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

Wiemy , że działają oba przykłady nr 1 i 2. Przykład nr 1 ma intuicyjny sens, podczas gdy przykład nr 2 nasuwa pierwotne pytanie .

Okazuje się, że kryptografia krzywych eliptycznych (zwana także „mnożeniem krzywych eliptycznych”) jest odpowiedzią na pierwotne pytanie. Kryptografia krzywych eliptycznych to matematyczna zależność, która umożliwia spełnienie następujących warunków:

  1. Klucz publiczny można wygenerować matematycznie z klucza prywatnego
  2. Klucz prywatny nie może zostać wygenerowany matematycznie z klucza publicznego (tj. „Funkcja zapadni”)
  3. Klucz prywatny może być zweryfikowane za pomocą klucza publicznego

Dla większości warunki # 1 i # 2 mają sens, ale co z # 3?

Masz dwie możliwości:

  1. Możesz zejść do króliczej nory i spędzić godziny na nauce, jak działa kryptografia krzywych eliptycznych ( tutaj jest świetny punkt wyjścia ) ... LUB ...
  2. Możesz zaakceptować powyższe właściwości - tak jak akceptujesz 3 prawa dynamiki Newtona bez konieczności samodzielnego ich wyprowadzania .

Podsumowując, para kluczy publiczny / prywatny jest tworzona za pomocą kryptografii krzywej eliptycznej, która z natury tworzy klucz publiczny i prywatny, które są matematycznie połączone w obu kierunkach, ale nie są matematycznie wyprowadzane w obu kierunkach . Dzięki temu możesz użyć czyjegoś klucza publicznego, aby sprawdzić, czy podpisał on określoną wiadomość, bez ujawniania Ci swojego klucza prywatnego.

Zach Gollwitzer
źródło
Twoje 3 warunki wyjaśniają wszystko. Właśnie przeczytałem ten termin „krzywa eliptyczna” i byłem jak wtf
Simon
5

Pomyślałem, że udzielę dodatkowego wyjaśnienia każdemu, kto szuka czegoś bardziej intuicyjnie odkrywającego.

Duża część tego zamieszania wynika z nazywania „kluczy publicznych” i „kluczy prywatnych” jako takich, ponieważ sposób, w jaki te rzeczy faktycznie działają, jest bezpośrednio sprzeczny z tym, jak rozumie się „klucz”.

Weźmy na przykład szyfrowanie. Można to uznać za działające w następujący sposób:

  • Strony, które chcą mieć możliwość odczytania tajnych wiadomości, zachowują ukryty klucz (tj. Klucz prywatny)
  • Strony, które chcą mieć możliwość wysyłania tajnych wiadomości, mają możliwość uzyskania odblokowanego, zablokowanego (tj. Publicznego blokady)
  • Wtedy wysłanie tajnej wiadomości jest tak proste, jak zablokowanie jej odblokowanym zamkiem, ale późniejsze jej odblokowanie można wykonać tylko jednym z ukrytych kluczy.

Pozwala to na przesyłanie tajnych wiadomości między stronami, ale z intuicyjnego punktu widzenia „zamek publiczny” jest bardziej odpowiednią nazwą niż „klucz publiczny”.

Jednak w przypadku wysyłania podpisów cyfrowych role są nieco odwrócone:

  • Strona, która chce podpisywać wiadomości, jest jedyną, która ma dostęp do odblokowanych zamków (tj. Blokady prywatnej)
  • Wszystkie strony, które chcą zweryfikować podpis, mają możliwość uzyskania klucza (tj. Klucza publicznego)
  • Następnie podpisujący tworzy dwie identyczne wiadomości: tę, którą każdy może przeczytać i jedną, która ma jej towarzyszyć, ale którą blokuje jednym ze swoich prywatnych zamków.
  • Następnie, gdy odbiorca otrzyma wiadomość, może ją przeczytać, a następnie użyć klucza publicznego, aby odblokować zablokowaną wiadomość i porównać dwie wiadomości. Jeśli wiadomości są takie same, to wiedzą, że:

    1. Odblokowana wiadomość nie została zmodyfikowana podczas podróży i

    2. Wiadomość musiała pochodzić od osoby, która ma zamek pasujący do klucza publicznego.

  • I wreszcie, cały ten system działa tylko wtedy, gdy każdy, kto chce zweryfikować podpis podpisującego, ma autorytatywne miejsce, do którego może udać się w celu uzyskania pasującego klucza do zamków podpisującego. W przeciwnym razie każdy może powiedzieć „Hej, oto klucz do takiej a takiej prywatnej blokady”, wysłać wiadomość podszywającą się pod niego, ale zablokować ją swoim prywatnym zamkiem, wykonujesz wszystkie powyższe kroki i uważasz, że wiadomość musi rzeczywiście być od osoby, o której myślałeś, ale dałeś się nabrać, ponieważ zostałeś wprowadzony w błąd co do prawdziwego właściciela klucza publicznego.

Dopóki istnieje godne zaufania źródło odzyskiwania klucza publicznego podpisującego, będziesz wiedzieć, kto jest prawowitym właścicielem klucza publicznego, i będziesz mógł zweryfikować jego podpis.

but
źródło
4
Zmiana „klucza” na „odblokowany zamek” tylko zwiększa zamieszanie.
Markiz Lorne
@EJP Nie zmieniam klucza na „odblokowany zamek”. Zostało zmienione na „blokowanie”. „Odblokowany, zablokowany” jest używany tylko w celu wyrażenia użycia przedmiotu. Pozdrawiam, taka jest twoja opinia, a jeśli masz jakiekolwiek długoterminowe doświadczenie w społeczności kryptowalut, jest to prawdopodobnie bardzo stronnicze, ponieważ istniejące terminy są tym, jak rozwinąłeś się, aby zrozumieć technologię. Dlaczego nie pozwolisz osobom, które dopiero zaczynają, określić, czy analogia jest przydatna, czy nie?
but
1
Myślę, że analogia z zamkami i kluczami jest całkiem dobra, aby zapewnić pierwsze zrozumienie tej sprawy. Po wizualizacji zamków i kluczy można je wymieniać różnymi liczbami całkowitymi, które są składane w klucze rsa (lub innego rodzaju).
Andreas Lundgren
Osobiście uważam, że ten wgląd jest najlepszy, jaki do tej pory przeczytałem. I zdecydowanie zobacz, jak dodanie blokady zamiast klucza do prywatnego / publicznego sprawia, że ​​cały system jest intuicyjnie zrozumiały dla zwykłych nowych użytkowników. W tej chwili wcale tak nie jest. Jesteśmy doświadczonymi programistami (do tej pory nie mamy bezpośredniego kontaktu z kryptowalutą) i przez jakiś czas kłóciliśmy się o cel publicznego / prywatnego. Mówiłem, że prywatny jest używany do szyfrowania, gdy mówił, że publiczny jest używany do szyfrowania: D
jayarjo
0

Na twoje pytanie - przyglądałem się implementacji RSA. I uzyskałem większą jasność co do sposobu, w jaki klucz publiczny jest używany do weryfikacji podpisu przy użyciu klucza prywatnego. Niewątpliwie klucz prywatny nie jest ujawniany. Oto jak...

Sztuczka polega na ukryciu klucza prywatnego w funkcji. W tym przypadku,(p-1)*(q-1).

Rozważ p jako klucz prywatny, a e jako klucz publiczny. „p” jest umieszczane w innej funkcji, aby było ukryte.

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

Wysłane dane = [zaszyfrowane (hash), wiadomość] = [m ^ d, wiadomość]; gdzie m jest komunikatem Załóżmy, że „Dane wysłane” = y. Aby sprawdzić integralność, znajdujemy y ^ e, aby uzyskać m. Od m ^(d*e) = m ^1 = m.

Mam nadzieję że to pomoże! :)

George John
źródło