Ergänzungen zu Poker per E-Mail“ ” Detlef Sieling Fachbereich Informatik, Universität Dortmund, 44221 Dortmund Zusammenfassung. Im Folgenden werden die technischen Einzelheiten des von Shamir, Rivest und Adleman vorgeschlagenen Protokolls für das Pokern per E-Mail beschrieben. Das Protokoll von Shamir, Rivest und Adleman [1] verwendet die folgenden grundlegenden Notationen und Ergebnisse. • Mit p mod q (gelesen p modulo q) wird die Zahl bezeichnet, die bei der ganzzahligen Division von p durch q als Rest übrigbleibt. Beispielsweise ist 17 mod 3 = 2 (da 17÷3 = 5 Rest 2 ist). Man kann sich überlegen, dass es bei der Multiplikation von Zahlen modulo n egal ist, ob die Modulo-Operation einmal am Schluss ausgeführt wird oder zusätzlich auch zwischendurch, d.h., es gilt (a mod n) · (b mod n) mod n = a · b mod n. Analog gilt dies beim Potenzieren, d.h., (a mod n)x mod n = a x mod n. • Der kleine Satz von Fermat lautet: Wenn n eine Primzahl ist und c eine beliebige natürliche Zahl zwischen 1 und n − 1, so ist cn−1 mod n = 1. • Man kennt effiziente Algorithmen, um zufällige Primzahlen mit (beispielsweise) 100 Dezimalstellen zu finden. • Wenn m und e natürliche Zahlen mit ggT(m, e) = 1 sind, gibt es genau eine Zahl d zwischen 1 und m − 1, sodass e · d mod m = 1 gilt. Diese Zahl d kann auf effiziente Weise aus e und m berechnet werden. Für das Pokern verwenden Alice und Bob das folgende Protokoll. Zu Beginn einigen sich beide Spieler auf eine große (beispielsweise einhundertstellige) Primzahl n. Weiterhin erzeugt Alice eine zufällige Zahl e A aus dem Bereich von 2 bis n − 2 mit ggT(e A , n − 1) = 1. Sie berechnet aus e A und n − 1 die Zahl d A mit e A · d A mod (n − 1) = 1. Die Zahlen e A und d A behält Alice für sich. In analoger Weise erzeugt Bob eine zufällige Zahl e B und die zugehörige Zahl d B mit e B · d B mod (n − 1) = 1 und behält diese Zahlen für sich. Jeder Karte ist wieder eine Nummer fest zugeordnet, sodass beide Spieler diese Zuordnung kennen. Anders als vorher müssen wir hier die Nummern 0 und 1 ausschließen. Wir gehen der Einfachheit halber im Folgenden von der Zuordnung Kreuz-As gleich 2, Kreuz-Zwei gleich 3 usw. aus. 1 Die Funktionen a(x) und b(x) sind nun folgendermaßen definiert: a(x) = x e A mod n und b(x) = x e B mod n. Die Funktionen a −1 und b−1 kann man dann leicht angeben: a −1 (y) = y d A mod n und b−1 (y) = y d B mod n. Hier findet sich auch die Erklärung, warum 0 und 1 als Nummern von Karten auszuschließen sind: Unabhängig von e A ist a(0) = 0 und a(1) = 1. Auf weitere Details, wie die Nummern der Karten zu wählen sind, um das Protokoll möglichst sicher zu machen, wollen wir hier nicht eingehen. Wir beobachten aber, dass anders als in [2] die Codes beliebige Zahlen aus dem Bereich von 2 bis n − 1 sein können und nicht nur die Zahlen 0 bis 51. Wir wollen nun nachrechnen, dass a und b die gewünschten Eigenschaften haben. 1. Behauptung: a −1 ist die Umkehrfunktion von a. Beweis: Wir nehmen an, dass x aus dem Bereich von 1 bis n − 1 ist. Dann gilt a −1 (a(x)) = (x e A mod n)d A mod n = x e A ·d A mod n = x 1+r (n−1) mod n = x · (x n−1 )r mod n. Wir nutzen hierbei aus, dass e A · d A mod (n − 1) = 1 ist. Demzufolge lässt sich e A · d A auch als Eins plus ein ganzzahliges Vielfaches von n − 1 schreiben, also als 1 + r (n − 1). Aus dem kleinen Satz von Fermat folgt nun, dass x n−1 mod n = 1 gilt. Somit lässt sich die vorherige Rechnung folgendermaßen fortsetzen: a −1 (a(x)) = x · (x n−1 )r mod n = x · 1r mod n = x. Also ist a −1 wirklich die Umkehrfunktion von a. Analog kann man dies für b und b−1 zeigen. 2. Behauptung: Die Funktionen a und b kommutieren. Beweis: a(b(x)) = (x e B mod n)e A mod n = x e B e A mod n = (x e A mod n)e B mod n = b(a(x)). Die Funktionen a und b haben also die gewünschten Eigenschaften. Das Protokoll kann nun folgendermaßen realisiert werden: Zum Mischen der Karten berechnet Bob b(2), . . . , b(53) und sendet diese (vermischt) an Alice. Alice berechnet dann a(b(2)), . . . , a(b(53)) und sendet diese Werte (vermischt) an Bob. Damit haben beide Spieler die Codes der Karten. Das Verteilen der Karten geht dann genauso wie vorher: Um Alice eine Karte zu geben, wählt Bob einen noch nicht verwendeten Code a(b(x)) aus, wendet die Funktion b−1 darauf an, erhält also b−1 (a(b(x))) = a(x) und sendet diesen Wert zusammen mit a(b(x)) an Alice. Diese kann dann den verwendeten Code a(b(x)) streichen, sodass die Karte x nicht mehrfach vergeben wird, und aus a(x) die Karte x berechnen. Das Verteilen der Karten an Bob geht analog. 2 Bei diesem Protokoll ist es nicht nötig, dass Alice und Bob sich mit Hilfe einer Einwegfunktion auf die Funktionen a und b festlegen: Wir gehen davon aus, dass Alice im Spiel die Funktion a verwendet hat, um zu der Karte mit der Nummer x die Codierung a(x) zu berechnen. Wenn sie nun statt der Karte x sich nachträglich die Karte mit der Nummer y geben möchte, müsste sie eine Funktion a ′ finden, sodass a ′ (y) = a(x) ist. D.h., sie müsste ein e′A finden, sodass ′ y e A mod n = a(x) ist. Für die Berechnung eines solchen e′A kennt man aber keinen effizienten Algorithmus. Für die Kontrolle, ob der Partner fair gespielt hat, genügt es somit, dass Alice e A an Bob schickt und Bob e B an Alice. Dann können beide Spieler überprüfen, ob ihr Partner korrekt gespielt hat. Ein weiterer Vorteil des hier beschriebenen Protokolls besteht darin, dass eine Schwachstelle des in [2] beschriebenen Protokolls beseitigt ist. Diese besteht darin, dass beispielsweise Alice im Laufe des Spiels Informationen über die Funktion b erhält: Wenn Alice eine Karte x erhält, erhält sie von Bob die Werte a(x) und a(b(x)). Den Wert a(x) benötigt sie für die Berechnung von x, den Wert a(b(x)), um die Karte x nicht versehentlich auch an Bob zu geben. Wir benutzen nun die Bezeichnung z für a(x). Dann gilt: a(b(x)) = b(a(x)) = b(z). Somit erfährt Alice, was b(z) ist. Dies kann sie nun benutzen, um weitere Funktionswerte von b zu erfahren. Da sie die Funktion a kennt, kann sie z ′ = a(z) berechnen. Nun gilt: b(z ′) = b(a(z)) = a(b(z)). Da Alice b(z) und die Funktion a kennt, erhält sie somit auch b(z ′) und damit auch die Zuordnung (z ′ , b(z ′)). Dieses Verfahren kann sie iterieren und somit weitere Paare (z ′′ , b(z ′′ )) bestimmen. Da es in dem Protokoll in [2] nur 52 derartige Paare gibt, die auch alle zur Codierung verwendet werden, erhält Alice Informationen, die sie für ein faires Spiel nicht bekommen dürfte. In dem hier beschriebenen Protokoll gibt es dagegen ca. 10100 Paare (z ′′ , b(z ′′)). Dies sind so viele, dass Alice nur einen verschwindend kleinen Anteil davon berechnen kann, sodass ihre Chance, dabei ein Paar zu finden, das im aktuellen Spiel verwendet wird, sehr gering ist. Literaturverzeichnis [1] Shamir, A., Rivest, R.L., Adleman, M. (1981). Mental Poker. The Mathematical Gardner, herausgegeben von David A. Klarner, Wadsworth International, Belmont, S. 37–43. Erhältlich unter http://theory.lcs.mit.edu/∼rivest/ShamirRivestAdleman-MentalPoker.pdf [2] Sieling, D. (2006). Poker per E-Mail. 29. Beitrag in der Reihe Algorithmus der Woche“. ” Erhältlich unter http://www-i1.informatik.rwth-aachen.de/∼algorithmus/liste.php 3