Jedno wyjaśnienie odnośnie kryptografii asymetrycznej. Przyjęło się mówić, że klucz publiczny służy do szyfrowania, a klucz prywatny do podpisywania. Zapomina się przy okazji o tym, że klucz prywatny służy do odszyfrowywania a klucz publiczny do weryfikowania podpisu.
O symetrii kryptografii asymetrycznej
W jedną stronę jest prosto. Szyfruje się przy pomocy klucza prywatnego, odszyfrowuje się przy pomocy klucza prywatnego. A jak jest przy podpisie i jego weryfikacji? Odwrotnie. Szyfruje się (skrót podpisywanych danych) przy pomocy klucza prywatnego, a następnie odszyfrowuje się to przy pomocy klucza publicznego i porównuje się ze skrótem weryfikowanych danych. Innymi słowy zarówno klucz publiczny, jak i klucz prywatny może zostać wykorzystany do szyfrowania, podobnie oba klucze mogą zostać użyte do odszyfrowania. Zapomnijmy na chwilę o pojęciach klucz publiczny i klucz prywatny, nazwijmy je po prostu k1 i k2. Jeśli szyfrowanie jest wykonywane przy pomocy k1, odszyfrować wiadomość należy przy pomocy k2, i analogicznie, jeśli do szyfrowania wykorzystany został klucz k2, w celu odszyfrowania należy użyć k1.
Dlaczego to wyjaśnienie? Dlatego, że pisząc o proof-of-possession popełniłem drobny błąd. Napisałem mianowicie "Taką operacją może być odszyfrowanie pewnej informacji przy pomocy klucza publicznego", a chciałem napisać "Taką operacją może być odszyfrowanie pewnej informacji zaszyfrowanej przy pomocy klucza publicznego.". I tutaj zrodziło się wątpliwość "przecież klucz publiczny służy do szyfrowania a nie odszyfrowywania". Jak widać - nie koniecznie. Swoją drogą taka metoda wykonania proof-of-possession też ma prawo istnienia. Zwykle proof-of-possession wygląda tak:
- klient generuje i szyfruje jakąś liczbę losową,
- serwer odszyfrowuje ją i odsyła do klienta,
- klient porównuje wygenerowaną liczbę z liczbą wygenerowaną przez serwer,
Dowód w tym wypadku opiera się na tym, że tylko posiadacz klucza prywatnego jest w stanie odszyfrować wiadomość zaszyfrowaną w ten sposób. Ale możliwe jest również inne podejście:
- klient generuje liczbę losową i przesyła ją do serwera,
- serwer podpisuje (czyli właściwie szyfruje przy pomocy klucza prywatnego tę liczbę, lub jej skrót) i odsyła do klienta,
- klient weryfikuje podpis (czyli właściwie odszyfrowuje wiadomość przy pomocy klucza publicznego i porównuje wygenerowaną liczbę z odesłaną przez serwer).
...i to jest właśnie symetria kryptografii asymetrycznej...