Jaka jest różnica między szyfrowaniem a podpisywaniem w szyfrowaniu asymetrycznym?

296

Jaka jest różnica między szyfrowaniem niektórych danych a podpisywaniem niektórych danych (przy użyciu RSA)?

Czy po prostu odwraca rolę kluczy publiczno-prywatnych?

Na przykład chcę używać mojego klucza prywatnego do generowania wiadomości, więc tylko ja mogę być nadawcą. Chcę, aby mój klucz publiczny był używany do czytania wiadomości i nie obchodzi mnie, kto je czyta. Chcę mieć możliwość szyfrowania niektórych informacji i używania ich jako klucza produktu dla mojego oprogramowania. Obchodzi mnie tylko to, że tylko ja mogę je wygenerować. Chciałbym dołączyć mój klucz publiczny do mojego oprogramowania, aby odszyfrować / odczytać podpis klucza. Nie obchodzi mnie, kto może odczytać dane w kluczu, dbam tylko o to, że jestem jedynym weryfikowalnym, który może je wygenerować.

Czy podpisywanie jest przydatne w tym scenariuszu?

mmcdole
źródło

Odpowiedzi:

440

Podczas szyfrowania używasz ich klucza publicznego, aby napisać wiadomość, a oni używają swojego klucza prywatnego, aby ją odczytać.

Podczas podpisywania używasz klucza prywatnego do pisania podpisu wiadomości, a oni używają twojego klucza publicznego, aby sprawdzić, czy to naprawdę twój.

Chcę używać mojego klucza prywatnego do generowania wiadomości, więc tylko ja mogę być nadawcą.

Chcę, aby mój klucz publiczny był używany do czytania wiadomości i nie obchodzi mnie, kto je czyta

To jest podpisywanie , odbywa się to za pomocą klucza prywatnego.

Chcę mieć możliwość szyfrowania niektórych informacji i używania ich jako klucza produktu dla mojego oprogramowania.

Obchodzi mnie tylko to, że tylko ja mogę je wygenerować.

Jeśli musisz to wiedzieć tylko sam, nie musisz w tym celu bawić się kluczami. Możesz po prostu generować losowe dane i przechowywać je w bazie danych.

Ale jeśli chcesz, aby ludzie wiedzieli, że klucze są naprawdę twoje, musisz wygenerować losowe dane, przechowywać w nich bazę danych i podpisać je kluczem.

Chciałbym dołączyć mój klucz publiczny do mojego oprogramowania, aby odszyfrować / odczytać podpis klucza.

Prawdopodobnie będziesz musiał kupić certyfikat dla swojego klucza publicznego od komercyjnego dostawcy, takiego jak Verisign lub Thawte, aby ludzie mogli sprawdzić, czy nikt nie sfałszował twojego oprogramowania i nie zastąpił twojego klucza publicznego swoim.

Quassnoi
źródło
7
Technicznie rzecz biorąc, kiedy mówisz, że klucz prywatny jest używany do pisania podpisu wiadomości, mówisz, że skrót wiadomości jest szyfrowany za pomocą mojego klucza prywatnego?
Andy Ibanez
4
@AndyIbanez: to, co jest szyfrowane ( skrót ), może również zawierać znacznik czasu i losową sól, ale tak to jest sedno.
Quassnoi,
7
@Quassnoi W rzeczywistości, gdy mówimy „podpisuj kluczem prywatnym”, oznacza to, że nie „szyfruj”, ale zamiast tego oznacza „odszyfruj”. Podpisanie wiadomości w przybliżeniu jest takie samo jak odszyfrowanie kluczem prywatnym, aw odbiorniku szyfrowanie za pomocą klucza publicznego, w ten sposób skrót stanie się taki sam i będzie można go porównać.
Johnny Willer,
5
@JohnnyWiller: jak wspomniano poniżej @slim, rdzeń matematyczny jest taki sam zarówno dla funkcji szyfrowania, jak i deszyfrowania. Nie są oddzielnymi funkcjami, są tą samą funkcją f(key, message), żef(private, f(public, message)) === f(public, f(private, message)) === message
Quassnoi
2
@ Kochanie nie, nie jest. Generowanie pary kluczy jest bezpłatne. Kosztem jest przekonanie innych, że podpis jest naprawdę twój. Aby to zrobić, masz sam klucz publiczny, który wcześniej wygenerowałeś za darmo, podpisany przez organ, który może, ale nie musi, pobierać za to pieniądze.
Quassnoi
143

W krypto RSA, gdy generujesz parę kluczy, jest całkowicie arbitralne, który z nich wybierzesz jako klucz publiczny, a który klucz prywatny. Jeśli zaszyfrujesz jednym, możesz odszyfrować drugim - działa to w obu kierunkach.

Tak więc dość łatwo jest zobaczyć, jak można zaszyfrować wiadomość za pomocą klucza publicznego odbiorcy , aby odbiorca mógł ją odszyfrować za pomocą klucza prywatnego .

Podpis jest dowodem, że osoba podpisująca ma klucz prywatny, który pasuje do jakiegoś klucza publicznego. Aby to zrobić, wystarczy zaszyfrować wiadomość za pomocą klucza prywatnego tego nadawcy i dołączyć zaszyfrowaną wersję wraz z wersją zwykłego tekstu. Aby zweryfikować nadawcę, odszyfruj zaszyfrowaną wersję i sprawdź, czy jest ona taka sama jak zwykły tekst.

Oczywiście oznacza to, że twoja wiadomość nie jest tajna. Każdy może go odszyfrować, ponieważ klucz publiczny jest dobrze znany. Ale kiedy to robią, udowodnili, że twórca tekstu zaszyfrowanego ma odpowiedni klucz prywatny.

Oznacza to jednak podwojenie rozmiaru transmisji - tekstu jawnego i tekstu zaszyfrowanego razem (zakładając, że chcesz, aby ludzie, którzy nie są zainteresowani weryfikacją podpisu, przeczytali wiadomość). Zamiast tego zazwyczaj podpis jest tworzony przez utworzenie skrótu w postaci zwykłego tekstu. Ważne jest, aby nie można było tworzyć fałszywych skrótów, dlatego wykorzystywane są algorytmy szyfrujące, takie jak SHA-2.

Więc:

  • Aby wygenerować podpis, utwórz skrót z tekstu jawnego, zaszyfruj go kluczem prywatnym, dołącz go obok tekstu jawnego.
  • Aby zweryfikować podpis, wykonaj skrót z tekstu jawnego, odszyfruj podpis za pomocą klucza publicznego nadawcy, sprawdź, czy oba skróty są takie same.
slim
źródło
8
@headcode dotyczy tylko kluczy asymetrycznych. Klucze symetryczne nie występują w parach.
szczupły
3
W rzeczywistości dotyczy to tylko kluczy RSA. Na przykład za pomocą kluczy ECDSA można w prosty sposób generować klucz publiczny z klucza prywatnego, a klucz prywatny jest skalarem, a klucz publiczny jest współrzędną.
David Schwartz,
5
Jak odszyfrować wiadomości za pomocą kluczy PUBLICZNYCH? Czy wiadomości nie są odszyfrowywane tylko za pomocą kluczy prywatnych?
daremkd,
3
5 źródeł sprzecznych z tą odpowiedzią 1 , 2 , 3 , 4 , 5
wha7ever
6
To nie jest arbitralne, który nazywasz publicznym i prywatnym. Możesz wygenerować klucz publiczny z klucza prywatnego, ale nie możesz wygenerować klucza prywatnego z klucza publicznego. Czy to nie duża różnica?
Greg Schmit
23

Istnieją dwa wyraźne, ale ściśle powiązane problemy w ustanowieniu bezpiecznej komunikacji

  1. Szyfruj dane, aby tylko upoważnione osoby mogły je odszyfrować i odczytać.
  2. Sprawdź tożsamość / uwierzytelnienie nadawcy.

Oba te problemy można elegancko rozwiązać za pomocą kryptografii klucza publicznego.

I. Szyfrowanie i deszyfrowanie danych

Alice chce wysłać wiadomość do Boba, której nikt nie powinien przeczytać.

  • Alice szyfruje wiadomość kluczem publicznym Boba i wysyła ją dalej.
  • Bob odbiera wiadomość i odszyfrowuje ją za pomocą swojego klucza prywatnego.

Zauważ, że jeśli A chce wysłać wiadomość do B, A musi użyć klucza publicznego B (który jest publicznie dostępny dla każdego) i nie pojawia się tutaj ani publiczny ani prywatny klucz A.

Więc jeśli chcesz wysłać do mnie wiadomość, powinieneś znać i użyć mojego klucza publicznego, który ci dostarczam, i tylko ja będę w stanie odszyfrować wiadomość, ponieważ jestem jedynym, który ma dostęp do odpowiedniego klucza prywatnego.

II. Zweryfikuj tożsamość nadawcy (uwierzytelnianie)

Alice chce ponownie wysłać wiadomość do Boba. Problem szyfrowania danych rozwiązuje się powyższą metodą.

Ale co, jeśli siedzę między Alicją a Bobem, przedstawiając się Bobowi jako „Alice” i wysyłając Bobowi własną wiadomość zamiast przekazywać tę wysłaną przez Alice. Chociaż nie mogę odszyfrować i odczytać oryginalnej wiadomości wysłanej przez Alicję (która wymaga dostępu do prywatnego klucza Boba), przejmuję całą rozmowę między nimi.

Czy istnieje sposób, w jaki Bob może potwierdzić, że wiadomości, które otrzymuje, są w rzeczywistości wysyłane przez Alice?

  • Alice podpisuje wiadomość za pomocą swojego prywatnego klucza i wysyła ją dalej. (W praktyce podpisany jest skrót wiadomości, np. SHA-256 lub SHA-512.)
  • Bob odbiera go i weryfikuje za pomocą klucza publicznego Alice. Ponieważ klucz publiczny Alicji pomyślnie zweryfikował wiadomość, Bob może stwierdzić, że wiadomość została podpisana przez Alice.
Siva Prakash
źródło
1
Czy podpisując wiadomość, podpisujesz samą wiadomość lub wiadomość zaszyfrowaną?
FrostyStraw
21

Tak, pomyśl o podpisywaniu danych jako nadaniu im własnej pieczęci woskowej, której nikt inny nie ma. Robi się to w celu osiągnięcia integralności i niezaprzeczalności . Szyfrowanie jest tak, że nikt inny nie może zobaczyć danych. Odbywa się to w celu zachowania poufności . Zobacz wikipedia http://en.wikipedia.org/wiki/Information_security#Key_concepts

Podpis to skrót wiadomości podpisany przy użyciu klucza prywatnego.

Johnno Nolan
źródło
16

Podpisywanie powoduje wygenerowanie „skrótu” za pomocą klucza prywatnego, który można zweryfikować za pomocą klucza publicznego. Tekst zostanie wysłany w czystej postaci.

Szyfrowanie wykorzystuje klucz publiczny odbiorcy do szyfrowania danych; dekodowanie odbywa się za pomocą ich klucza prywatnego.

Tak więc użycie kluczy nie jest odwrócone (w przeciwnym razie Twój klucz prywatny nie byłby już prywatny!).

Doug Currie
źródło
W normalnym szyfrowaniu asymetrycznym szyfrowanie odbywa się za pomocą klucza publicznego odbiorców, a nie klucza prywatnego.
mmcdole
Czy przegapiłeś, że to pytanie dotyczyło RSA, w którym użycie kluczy jest odwrócone i gdzie nie narusza klucza prywatnego.
David Schwartz,
8

Opisujesz dokładnie, w jaki sposób i dlaczego podpisywanie jest używane w kryptografii klucza publicznego. Pamiętaj, że podpisywanie (lub szyfrowanie) wiadomości arytmetycznych dostarczanych przez inne osoby jest bardzo niebezpieczne - pozwala to na ataki na algorytmy, które mogłyby naruszyć twoje klucze.

Michael Borgwardt
źródło
1
Czy przeglądarki internetowe nie szyfrują dowolnych danych podczas korzystania z SSL?
Ian Warburton
2
@IanWarburton: Ale nie używają do tego szyfrowania asymetrycznego. Rzeczywiste transfery danych wykorzystują szyfrowanie symetryczne z losowo generowanym kluczem sesji.
Michael Borgwardt,
1
@IanWarburton: nie, ponieważ żaden nie zostałby wybrany przez atakującego. Niebezpieczeństwo polega na szyfrowaniu lub podpisywaniu czegoś dostarczonego bezpośrednio przez atakującego, ponieważ może to być bardzo celowo spreparowane w celu ujawnienia informacji o twoim kluczu prywatnym, a nawet stworzenia podpisów, które wydają się ważne dla czegoś, czego nie zamierzałeś podpisać. Szczegółowy podział działania tego drugiego przypadku dla RSA znajduje się tutaj: crypto.stackexchange.com/questions/35644/…
Michael Borgwardt,
2
@IanWarburton: dlatego RSA wymaga wypełniania, więc nigdy nie szyfruj tylko wybranej wiadomości: en.wikipedia.org/wiki/… - ale tak naprawdę operacje obejmujące klucz prywatny (jak podpisywanie) są szczególnie podatne na wybrane dane wejściowe.
Michael Borgwardt,
1
@IanWarburton Nie jestem ekspertem od kryptografii, ale z tego, co rozumiem, nie powinno to powodować żadnych problemów.
Michael Borgwardt,
8

Podpisywanie oznacza, że ​​naprawdę jesteś źródłem lub gwarantem podpisanego obiektu. Jednak każdy może odczytać obiekt.

Szyfrowanie oznacza, że ​​tylko osoby z odpowiednim kluczem prywatnym mogą go odczytać, ale bez podpisania nie ma gwarancji, że jesteś za zaszyfrowanym obiektem.

rjamestaylor
źródło
Jeśli wiadomość zostanie odszyfrowana przez mój klucz łonowy, to tylko ja mógłbym ją wysłać. (Zakładając, że mój klucz prywatny nie jest zagrożony)
Dojo
5

Jaka jest różnica między szyfrowaniem niektórych danych a podpisywaniem niektórych danych (przy użyciu RSA)?

Szyfrowanie zachowuje poufność wiadomości („niektóre dane”), a podpisywanie zapewnia niezaprzeczalność: tzn. Tylko podmiot, który ją podpisał, mógł ją podpisać. Istnieją również różnice funkcjonalne; Czytaj.

Czy po prostu odwraca rolę kluczy publiczno-prywatnych?

Absolutnie nie. Używanie tych samych kluczy prywatnych do podpisywania i deszyfrowania (lub, podobnie, tych samych kluczy publicznych do weryfikacji i szyfrowania ) jest lekceważone, ponieważ nie należy mieszać celów. Nie jest to tak bardzo kwestia matematyczna (RSA powinien być nadal bezpieczny), ale problem z zarządzaniem kluczami , w którym np. Klucz do podpisu powinien mieć krótszą żywotność i zawierać większą ochronę przed jego użyciem.

W przypadku tej samej wiadomości należy użyć klucza prywatnego nadawcy do podpisania, a odbiorników zaufanego klucza publicznego do szyfrowania. Zwykle używa się podpisywania, a następnie szyfrowania, w przeciwnym razie przeciwnik mógłby zastąpić podpis swoim. Podobnie należy użyć klucza prywatnego odbiorcy do odszyfrowania i zaufanego klucza publicznego nadawcy do weryfikacji.

Ponadto należy zrozumieć, że przy generowaniu podpisów nie stosuje się „szyfrowania kluczem prywatnym”. Chociaż wszystkie operacje RSA opierają się na potęgowaniu modułowym, schemat wypełniania jest zupełnie inny w przypadku generowania sygnatur. Ponadto klucz publiczny ma zupełnie inne właściwości niż klucz prywatny RSA we wszystkich praktycznych zastosowaniach RSA.

Na przykład chcę używać mojego klucza prywatnego do generowania wiadomości, więc tylko ja mogę być nadawcą.

Jest to właściwość niezaprzeczalności, którą można uzyskać poprzez podpisanie.

Chcę, aby mój klucz publiczny był używany do czytania wiadomości i nie obchodzi mnie, kto je czyta.

Klucz publiczny powinien być uważany przez wszystkich za znany. Jeśli chcesz, aby wszyscy czytali wiadomości, po prostu ich nie szyfruj.

Podpisywanie zasadniczo nie wpływa na treść wiadomości. Wiadomość jest uważana za oddzielną od podpisów. Oficjalnie takie podpisy są znane jako „podpisy z dodatkiem”, gdzie załącznik stanowi komunikat. To trochę dziwne imię, ponieważ wiadomość jest uważana za ważniejszą niż podpis nad nią, ale tak. Tylko kilka podpisów oferuje (częściowe) odzyskiwanie wiadomości; nie są już często używane i są ogólnie uważane za przestarzałe.

Należy pamiętać, że protokoły podpisu, takie jak CMS, mogą wdrożyć format kontenera, który zawiera zarówno wiadomość, jak i podpis. W takim przypadku musisz najpierw wyciągnąć - nadal niezaszyfrowaną - wiadomość z kontenera, podobnie jak rozpakowanie pliku z zwykłego archiwum .zip. Tak więc wiadomość może być ukryta i nie może być bezpośrednio użyta w takim przypadku.

Chcę mieć możliwość szyfrowania niektórych informacji i używania ich jako klucza produktu dla mojego oprogramowania. Obchodzi mnie tylko to, że tylko ja mogę je wygenerować.

Szyfrowanie służy do zachowania poufności. W przeszłości generowanie podpisu RSA było często uważane za „szyfrowanie kluczem prywatnym”. Jednak operacje są zupełnie inne, jak wyjaśniono powyżej, a późniejsze standardy desperacko próbują oddzielić szyfrowanie i generowanie podpisów.

Chciałbym dołączyć mój klucz publiczny do mojego oprogramowania, aby odszyfrować / odczytać podpis klucza. Nie obchodzi mnie, kto może odczytać dane w kluczu, dbam tylko o to, że jestem jedynym weryfikowalnym, który może je wygenerować.

Tak, nazywa się to ustanowieniem zaufania do klucza publicznego. Jednak ochrona kodu programu różni się bardzo od ochrony wiadomości. Możesz wykonać podpisywanie kodu, ale wtedy potrzebujesz czegoś, aby sprawdzić podpis poza swoim kodem . Istnieją systemy operacyjne, które to oferują.

Na przykład istnieje Microsoft Authenticode. Sklepy z aplikacjami, takie jak sklep z aplikacjami iStore i Android, mogą, ale nie muszą, korzystać z podpisywania kodu, ale zapewniają pewne zapewnienie, że aplikacja nie jest klonowana lub przynajmniej nie jest klonowana w sklepie. W końcu kryptografia nie zawsze jest rozwiązaniem.

Utrzymując swój kod przed sklonowany / zmienione w ogóle jest o wiele trudniejsze, a chcesz być solidnie na terytorium DRM jeśli go w ten sposób.

Czy podpisywanie jest przydatne w tym scenariuszu?

Tak, absolutnie. Z pewnością może pomóc upewnić się, że wiadomości zostały podpisane tylko przez Ciebie, jeśli istnieje zaufanie do klucza publicznego. To, czy może być przydatne do uwierzytelnienia kodu aplikacji / zintegrowanego klucza publicznego, zależy całkowicie od środowiska, w którym spodziewasz się uruchomić kod.

Maarten Bodewes
źródło
„W przeszłości generowanie sygnatur RSA było często uważane za„ szyfrowanie kluczem prywatnym ”. Jednak operacje są zupełnie inne, jak wyjaśniono powyżej, a późniejsze standardy desperacko próbują rozdzielić szyfrowanie i generowanie sygnatur”. - nie jest to dla mnie jasne. Każdy KeyPair może być pk lub sk, a to, co szyfruje, może odszyfrować. Jeśli się z tym zgodzimy, to jak możemy argumentować, że podpisywanie i szyfrowanie różni się w jakikolwiek znaczący sposób? Oba szyfrują, a następnie można je odszyfrować tylko za pomocą drugiego klucza. Widziałem odniesienia do funkcji podpisywania, czy jest to powiązane?
Morgan
Jedyną różnicą, o której wiem w funkcji podpisywania, jest mieszanie wiadomości przed szyfrowaniem.
Morgan
4

W twoim scenariuszu nie szyfrujesz w rozumieniu szyfrowania asymetrycznego; Wolę nazwać to „kodowaniem”.

Tak więc kodujesz swoje dane w postaci binarnej, a następnie podpisujesz kluczem prywatnym. Jeśli nie możesz zweryfikować podpisu za pomocą klucza publicznego, wiesz, że podpisane dane nie są generowane za pomocą klucza prywatnego. („weryfikacja” oznacza, że ​​niepodpisane dane nie mają znaczenia)

devio
źródło
2

Funkcjonalnie używasz szyfrowania klucza publicznego / prywatnego, aby mieć pewność, że tylko odbiorca może odczytać twoją wiadomość. Wiadomość jest szyfrowana przy użyciu klucza publicznego odbiornika i odszyfrowywana przy użyciu klucza prywatnego odbiornika.

Podpisanie umożliwia powiadomienie odbiorcy o utworzeniu wiadomości i nie zmieniła się podczas przesyłania. Podpisywanie wiadomości odbywa się za pomocą własnego klucza prywatnego. Odbiorca może użyć klucza publicznego, aby sprawdzić, czy wiadomość nie została naruszona.

Jeśli chodzi o zastosowany algorytm: dotyczy to funkcji jednokierunkowej, patrz na przykład wikipedia . Jeden z pierwszych takich algorytmów używa dużych liczb pierwszych, ale od tego czasu wymyślono więcej funkcji jednokierunkowych.

Wyszukaj „Bob”, „Alice” i „Mallory”, aby znaleźć artykuły wprowadzające w Internecie.

Gerbrand
źródło
Czy możesz skomentować mój przypadek użycia? Chcę użyć klucza prywatnego do szyfrowania i klucza publicznego, aby umożliwić każdemu i każdemu odszyfrowanie.
mmcdole
1
To nieprawda, że ​​wszystkie szyfrowanie asymetryczne oparte jest na liczbach pierwszych, jest to tylko najbardziej znany przykład (RSA); istnieją inne metody, takie jak kryptografia krzywych eliptycznych.
Michael Borgwardt,
„Wiadomość jest szyfrowana, a następnie szyfrowana przy użyciu klucza publicznego odbiornika”. To zdanie po prostu nie ma sensu, a przynajmniej wymaga dalszych wyjaśnień. „zaszyfrowane, a następnie zaszyfrowane” ???
Maarten Bodewes
Zapomniałeś Trenta! :)
Dojo
1

Odpowiadając na to pytanie w treści, w której pytający zamierzali zastosować rozwiązanie do licencjonowania oprogramowania, wymagania są następujące:

  1. Żadna inna firma nie może wygenerować klucza licencyjnego z dekompilacji aplikacji
  2. Treść klucza oprogramowania nie musi być bezpieczna
  3. Klucz oprogramowania nie jest czytelny dla człowieka

Podpis cyfrowy rozwiąże ten problem, ponieważ nieprzetworzone dane, które powodują, że klucz może być podpisany kluczem prywatnym, co sprawia, że ​​nie jest on czytelny dla człowieka, ale może zostać zdekodowany, jeśli zostanie poddany inżynierii odwrotnej. Ale klucz prywatny jest bezpieczny, co oznacza, że ​​nikt nie będzie mógł tworzyć licencji na twoje oprogramowanie (o to chodzi).

Pamiętaj, że nie możesz uniemożliwić wykwalifikowanej osobie usunięcia blokady oprogramowania w twoim produkcie. Więc jeśli będą musieli włamać się do każdej wydanej wersji. Ale tak naprawdę nie chcesz, aby były one w stanie wygenerować nowe klucze dla Twojego produktu, które można udostępniać dla wszystkich wersji.

Python Dokumentacja PyNaCl zawiera przykład „podpisu cyfrowego”, który będzie odpowiadał temu celowi. http://pynacl.readthedocs.org/en/latest/signing/

i przyczyna projektu NaCl do przykładów C.

oden
źródło