RSA - Beispiel

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

Schlüssel waehlen

Alice

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

Bob

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

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 ]
Codierung des Textes und keine Verschluesselung

IntegersToText [ intList1 ] Decodierung keine Entschluesselung
"Schauen wir uns heute abend um 20.30 'Der Krieger und die Kaiserin' im Filmpalast an ? "
{ 5464936 , 6387045 , 7217271 , 6910496 , 7695987 , 2123877 , 7697509 , 2122082 , 6647396 , 2127213 , 2110000 , 3027760 , 2107204 , 6648352 , 4944489 , 6645605 , 7479413 , 7234592 , 6580581 , 2116449 , 6910821 , 7498094 , 2564201 , 7151686 , 6909037 , 7364972 , 6386548 , 2122094 , 2113312 } "Schauen wir uns heute abend um 20.30 'Der Krieger und die Kaiserin' im Filmpalast an ? "
Alice verschluesselt mit Bob's oeffentlichen Schluessel, die Nachricht wird gesendet
code = PublicEncryption [ message , Pb ]
{ 11754310 , 2187788 , 3955976 , 2311360 , 5799800 , 14765007 , 9915667 , 7016685 , 11522359 , 5949297 , 2923351 , 17499299 , 5136142 , 12144145 , 5403832 , 14166904 , 506423 , 10453904 , 3135093 , 12382000 , 14690780 , 2731500 , 18604359 , 12311642 , 11074661 , 14336698 , 18235218 , 8788723 , 18106821 }
Jemand faengt die Nachricht ab und versucht sie zu lesen (Umwandlun in ASCII-Text)
IntegersToText [ code ]
"³[F!b\n<]#DÀXxáKÏ—Mkí¯Ñ7ZÇq,›W £N_¹NRt¸Ø+xº7Ÿƒ/Öu¼ï0à)Ü)­ìáG»ÜZ¨üeÚº?R†óIÅ"
Bob entschluesselt die Nachricht von Alice mit seinem Privatschluessel
PrivateDecryption [ code , Sb ]
"Schauen wir uns heute abend um 20.30 'Der Krieger und die Kaiserin' im Filmpalast an ? "

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 ]
{ 746832 , 5806124 , 339753 , 8200889 , 18764450 , 12782064 , 4231432 , 6142722 , 17260083 , 4223121 , 11078858 , 8010647 , 17259434 , 14425378 , 3883412 , 90074 , 17074289 , 13874491 , 4372579 , 13942397 , 3920375 , 4627971 , 11363737 , 10949241 }
Auch dies Nachricht wird abgefangen
IntegersToText [ code ]
" ePX˜,/)}\"¹R¢Ã\tð@‘]»^3@p‘©\nÊz;—[ªÜ\";A”_ÚˆqÓµ;B¸cÔ¾};Ñ÷Fž­e™§y"
Alice entschluesselt die Antwort mit ihrem Privatschluessel
PrivateDecryption [ code , Sa ]
"Ja, ich freue mich schon, treffen wir uns um 20 Uhr am Bismarckplatz :-)"

Wie wird Verschluesselt ?

Wir verschluesseln die Nachricht

message = "Schauen wir uns heute abend um 20.30 'Der Krieger und die Kaiserin' im Filmpalast an ? " "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 { "Sch" , "aue" , "n w" , "ir " , "uns" , " he" , "ute" , " ab" , "end" , " um" , " 20" , ".30" , " 'D" , "er " , "Kri" , "ege" , "r u" , "nd " , "die" , " Ka" , "ise" , "rin" , "' i" , "m F" , "ilm" , "pal" , "ast" , " an" , " ? " }

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 ]
{ 5464936 , 6387045 , 7217271 , 6910496 , 7695987 , 2123877 , 7697509 , 2122082 , 6647396 , 2127213 , 2110000 , 3027760 , 2107204 , 6648352 , 4944489 , 6645605 , 7479413 , 7234592 , 6580581 , 2116449 , 6910821 , 7498094 , 2564201 , 7151686 , 6909037 , 7364972 , 6386548 , 2122094 , 2113312 }

Umwandlung in Text ergibt wieder strList

Map [ IntegerToString , intList ]
{ "Sch" , "aue" , "n w" , "ir " , "uns" , " he" , "ute" , " ab" , "end" , " um" , " 20" , ".30" , " 'D" , "er " , "Kri" , "ege" , "r u" , "nd " , "die" , " Ka" , "ise" , "rin" , "' i" , "m F" , "ilm" , "pal" , "ast" , " an" , " ? " }

Verschluesselt werden nun die Zahlen der 'intList'

code = Map [ ( PowerMod [ # , Pb [ [ 1 ] ] , Pb [ [ 2 ] ] ] ) & , intList ]
{ 11754310 , 2187788 , 3955976 , 2311360 , 5799800 , 14765007 , 9915667 , 7016685 , 11522359 , 5949297 , 2923351 , 17499299 , 5136142 , 12144145 , 5403832 , 14166904 , 506423 , 10453904 , 3135093 , 12382000 , 14690780 , 2731500 , 18604359 , 12311642 , 11074661 , 14336698 , 18235218 , 8788723 , 18106821 }

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

Map [ IntegerToString , code ]
{ "³[F" , "!b\n" , "<]" , "#DÀ" , "Xx" , "áKÏ" , "—M" , "kí" , "¯Ñ7" , "ZÇq" , ",›W" , " £" , "N_" , "¹N" , "Rt¸" , "Ø+x" , "º7" , "Ÿƒ" , "/Öu" , "¼ï0" , "à)Ü" , ")­ì" , "áG" , "»ÜZ" , "¨üe" , "Úº" , "?R" , "†ó" , "IÅ" }

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

result = Map [ ( PowerMod [ # , Sb [ [ 1 ] ] , Sb [ [ 2 ] ] ] ) & , code ]
{ 5464936 , 6387045 , 7217271 , 6910496 , 7695987 , 2123877 , 7697509 , 2122082 , 6647396 , 2127213 , 2110000 , 3027760 , 2107204 , 6648352 , 4944489 , 6645605 , 7479413 , 7234592 , 6580581 , 2116449 , 6910821 , 7498094 , 2564201 , 7151686 , 6909037 , 7364972 , 6386548 , 2122094 , 2113312 }

'result' wird in ASCII Text umgewandelt.

resultList = Map [ IntegerToString , result ]
{ "Sch" , "aue" , "n w" , "ir " , "uns" , " he" , "ute" , " ab" , "end" , " um" , " 20" , ".30" , " 'D" , "er " , "Kri" , "ege" , "r u" , "nd " , "die" , " Ka" , "ise" , "rin" , "' i" , "m F" , "ilm" , "pal" , "ast" , " an" , " ? " }

Zusammenfuegen der Nachricht

text = "" ; Do [ text = text <> resultList [ [ i ] ] , { i , 1 , Length [ resultList ] } ] ; text
"Schauen wir uns heute abend um 20.30 'Der Krieger und die Kaiserin' im Filmpalast an ? "


Converted by Mathematica      February 1, 2001