Załóżmy, że mamy 2 klientów (A oraz C) rozmawiających przez serwer (B)
A <=> B <=> C
Załóżmy, że serwer B to jednostka (osoba) niepowołana. Teraz zadanie problemowe: w jaki sposób zabezpieczyć rozmowę A z C w taki sposób, aby B nie było w stanie podszyć się pod C i spowodować, że rozmowa będzie wyglądała tak:
A <=> B (udające połączenie z C)
Rzecz jest prosta, jeśli posłużymy się kluczami prywatnymi (wspólnymi dla A i C) oraz przekazywanym przez B kluczem publicznym. Może przykład:
Jeśli założymy, że A oraz C znają jakiś ciąg znaków (n.p: '12345'), to rozpoczynając transmisję A może wysłać do C komendę:
'Uznam, że jesteś ok, jeśli przyślesz mi MD5 ze swojego klucza + liczba wylosowana 04'.
Klient C wysyła MD5('1234504'). Klient A może to sprawdzić, a mimo wszystko B nie jest w stanie przy następnym zapytaniu o MD5 + liczba 57 podszyć się pod C.
Problem zaczyna się, gdy nie ma możliwości wcześniej przesłać klucza prywatnego. Jak wtedy to rozwiązać? Jakieś pomysły?
[DOPISANE]
Zapomniałem dodać, że serwerów B może (ale nie musi!) być kilka (ale wszystkie nie zaufane) - czyli jest dozwolone przesyłanie części przez B1, a części przez B2 (o ile jest w sieci). Ale nie można założyć, że nie komunikują się one wzajemnie.