Pozostał do omówienia jeszcze problem double spendingu. Spróbujemy utworzyć taki algorytm, który umożliwi bankowi identyfikację klienta oszukującego, a jednocześnie nie naruszający anonimowości klienta przestrzegającego legalnej procedury. Załóżmy, że każdy klient ma 100 ciągów identyfikacyjnych. Bank zna wszystkie i może na podstawie znajomości jednego z nich stwierdzić tożsamość klienta. Klient przy tworzeniu banknotów, z których bank ma podpisać jeden, zapisuje na każdym zobowiązania bitowe dla 100 ciągów R1K100 i L1K100.
Zobowiązania bitowe można opisać w następujący sposób: jeżeli klient wyśle do banku zobowiązanie bitowe dla pewnego ciągu, bank jest pewien, że klient ustalił go i wygenerował dla niego przesłane zobowiązanie. Na podstawie samego zobowiązania bitowego bank nie może wydobyć żadnej informacji o oryginalnym ciągu. Dopiero klient w odpowiednim momencie może go opublikować. Wtedy bank może sprawdzić, czy zobowiązanie bitowe zostało faktycznie wytworzone dla tego ciągu.
Za pomocą szyfrowania symetrycznego można zaimplementować zobowiązania bitowe. W pierwszym kroku bank generuje losowy ciąg V i wysyła go do klienta. Klient wybiera ciąg A, dla którego chce utworzyć zobowiązanie bitowe i szyfruje ciąg złożony z V i A za pomocą klucza k. Stosowane jest dowolne szyfrowanie symetryczne. Po wytworzeniu kryptogramu klient przesyła bankowi wynik. Jeżeli zastosowany został dobry algorytm szyfrujący, to bank nie wie nic o ciągu A na podstawie kryptogramu.
Aby zweryfikować zobowiązanie bitowe, klient wysyła bankowi klucz k. Bank deszyfruje kryptogram i sprawdza, czy początek tak otrzymanego tekstu jawnego pokrywa się z ciągiem V. Jeżeli zachodzi równość, to znaczy, że klient wcześniej faktycznie wytworzył zobowiązanie bitowe dla ciągu V, jeżeli nie – to próbował oszukiwać i zmienić ciąg już po wytworzeniu zobowiązania bitowego.
Powróćmy teraz do 100 par ciągów R i L. Każdy z ciągów R jest generowany losowo, a ciągi L są tworzone przez operację Lj = Ij XOR Rj. W ten sposób każda para R i L określa jeden z ciągów identyfikacyjnych klienta. Przypomnijmy, że na każdym z wysłanych do banku banknotów znajduje się zestaw zobowiązań bitowych dla wszystkich 100 par ciągów. Po wybraniu jednego z banknotów bank żąda dodatkowo ujawnienia zobowiązań bitowych dla wszystkich innych banknotów. Jeżeli ujawnione ciągi R i L dają po wykonaniu operacji XOR faktyczne ciągi identyfikacyjne klienta, to wszystko jest w porządku.
Modyfikujemy także fazę przekazywania banknotu sprzedawcy. Przy zakupie sprzedawca generuje losowy ciąg zero-jedynkowy X o długości 100. Jeżeli element Xj jest zerem, to klient ujawnia zobowiązanie bitowe dla ciągu Rj, a jeżeli Xj jest jedynką – to dla Lj. Otrzymane ciągi R i L sprzedawca przekazuje bankowi.
Przy ponownym wydawaniu tego samego banknotu klient będzie musiał z pewnością podać inne zobowiązania bitowe. Sprzedawca nie zauważy oszustwa, ale bank będzie z dużym prawdopodobieństwem dysponował co najmniej jedną parą ciągów R i L. Na ich podstawie będzie umiał zrekonstruować jeden z ciągów identyfikacyjnych klienta i oszust zostanie zdemaskowany. Sprzedawca nie jest więc w stanie oszukać banku – jeżeli spróbuje oddać dwa razy ten sam banknot, to bank stwierdzi, że podane są zobowiązania bitowe dla tych samych ciągów jak poprzednio, co jednoznacznie wskazuje na oszustwo sprzedawcy.
Podsłuch i wirusy
Omówiony algorytm gwarantuje duży stopień bezpieczeństwa, jednak prawdziwe zagrożenia są niezależne od tego protokołu i jednakowe dla wszystkich algorytmów transferu elektronicznej gotówki. Przeciwnik, podsłuchując komunikację między bankiem a klientem, może bardzo szybko wydać otrzymany przez klienta banknot. W takim przypadku, oprócz strat materialnych, klient może zostać posądzony o próbę dokonania double spendingu. Z tego powodu cała komunikacja między klientem, bankiem i sprzedawcą musi być chroniona protokołami bezpiecznego przesyłania danych.
Zagrożeniem dla klientów mogą być również wirusy, które po dostaniu się na komputer klienta przejmują kontrolę nad programem obsługującym transfer elektronicznej gotówki i wysyłają świeżo otrzymane banknoty do przeciwnika. Takie wirusy mogą także zmieniać działanie programu w taki sposób, aby używał on do zapłaty kilka razy tego samego banknotu. W ten sposób można obciążyć dowolną osobę nieprawdziwymi zarzutami.