RSA - Beispiel

Uebung Grundlegende Algorithmen WS2000/01, zusammengestellt von Thomas Bayer, bayert@in.tum.de

Schluessel waehlen

Alice

{Pa,  Sa}  =  Keys[600, 601];
Pa
Sa

Bob

{Pb,  Sb}  =  Keys[602, 599];
Pb
Sb

Nachrichten Austauschen

Nachricht von Alice an Bob

message  = "Schauen wir uns heute abend um 20.30 'Der Krieger und \
die Kaiserin' im Filmpalast an ? "
intList1  =  TextToIntegers[message, 3]   
IntegersToText[
      intList1]                               (* Decodierung (keine Entschluesselung *)

Alice verschluesselt mit Bob's oeffentlichen Schluessel, die Nachricht wird gesendet

code = PublicEncryption[message, 
        Pb]

Jemand faengt die Nachricht ab und versucht sie zu lesen (Umwandlun in ASCII-Text)

IntegersToText[code]

Bob entschluesselt die Nachricht von Alice mit seinem Privatschluessel

PrivateDecryption[code,  Sb]

Bob verschluesselt seine Antwort mit Alice's oeffentlichen Schluessel

code  =  
      PublicEncryption["Ja, ich freue mich schon, treffen wir uns um 20 Uhr \
am Bismarckplatz :-)",  Pa]

Auch dies Nachricht wird abgefangen

IntegersToText[code]

Alice entschluesselt die Antwort mit ihrem Privatschluessel

PrivateDecryption[code,  Sa]

Wie wird Verschluesselt ?

Wir verschluesseln die Nachricht

message  = "Schauen wir uns heute abend um 20.30 'Der Krieger und \
die Kaiserin' im Filmpalast an ? "

Die Nachricht wird in Strings der Laenge 3 zerlegt, falls das letzte String zu kurz ist, dann werden Blanks angehaengt. (Hier: message hat 87 Zeichen)

str  =  "";  
    len  =  Ceiling[StringLength[message]/3];
strList  = 
        Table[If[StringLength[message] > 2,  
            str  =  StringTake[message, 3];  
            message  =  StringDrop[message, 3], str  =  message]; 
          str, {i, 1, len}];
lsr  =  Length[strList]; 
If[Length[strList[[lsr]]]  <  3,  
        strList[[lsr]]  =  strList[[lsr]]  <>  "  ";  
        strList[[lsr]]  =  
          StringTake[strList[[lsr]], 3]];
strList

Umwandeln der Strings in Zahlen, ein String der Laenge 3 entspricht einer 3-stelligen Zahl zur Basis 256.
Der String "a-B" entspricht 97*256^2 + 45*256^1 + 66*256^0

intList  =  Map[StringToInteger,  strList]

Umwandlung in Text ergibt wieder strList

Map[IntegerToString, intList]

Verschluesselt werden nun die Zahlen der 'intList'

code  =  
      Map[(PowerMod[#, Pb[[1]],  Pb[[2]]])  &,  
        intList]

Diese Zahlen koennen nun ueber einen unsicheren Kanal uebertragen werden. Eine Umwandlun in Text ergibt folgenden 'Kauderwelsch'

Map[IntegerToString, code]

Die Entschluesselung von 'code' mit dem Privatschluessel liefert die Liste 'result'

result  =  
      Map[(PowerMod[#, Sb[[1]], Sb[[2]]]) &, code]

'result' wird in ASCII Text umgewandelt.

resultList  =  Map[IntegerToString, result]

Zusammenfuegen der Nachricht

text  =  ""; 
Do[text  =  text  <>  resultList[[i]],  {i,  1,  
        Length[resultList]}];  text