El-Gamal-Verfahren und DSS-Signatur

Mathematik in wxMaxima www.mathematik-verstehen.de Haftendorn Jan 2011+Dez 12

0.1 Handlinghilfen

Achtung: Durch Anklicken der linken Zellmarkierung kann man die
Abschnitte und auch einzelne Zellen aufklappen und auch wieder zuklappen.
Dazu Shift halten, dann werden auch alle Unterebenen aufgeklappt.

Endung *.wxmx ist komfortabel. Ist die Endung *.wxm muss man
erst noch alle Ausgaben neu erzeugen. Mit Strg r werden alle aufgeklappten Zellen ausgewertet.
Zum Lernen ist es besser die Zellen einzeln (mit Shift+Enter) auszuwerten.

Werte einzelne Zellen aus mit Shift-Enter.
Auswertung in einem Rutsch: Falte alle Abschnitte auf (mit sh klick),
werte alle Zellen mit Strg r aus ( auch Menu Cell Alle Zellen auswerten).

0.2 Inhalt

Figure 1:
Result

1 Schüsselerzeugung

Anton, Berta und Tobi wollen gemeinsam kommunizieren. Dazu müssen
sie sich auf eine Verschlüsselungsfunktion einigen, und zu zwei
Zahlen p und g ein gemeinsame öffentliche Schlüsselliste erstellen.

1.1 Verabredung von p und g

p wird als Primzahl gewählt.

(%i2) p:next_prime(floor(sqrt(random(1.0)*10^122)));
10^60;

Result

(%i4) g:random(p-2);
10^60;

Result

Als kleines Beispiel eignet sich p:113; g:97

1.2 Verschlüsselungsfunktion

Es muss irgendeine invertierbare Funktion gewählt werden.
Sie soll die Nachricht und den jeweiligen Kommunikationsschlüssel
miteinander verrechnen.
Der Einfachheit haber wird hier das gewöhnliche Produkt genommen.

(%i6) f(k,m):=k*m; f_inv(k,c):=c/k;
Result

1.3 Öffentliche Schlüsselliste

Die drei wählen jeder für sich geheime Zahlen ta,tb,tt und
bilden den öffentlichen Teil Ihres Schlüssels

Anton

(%i8) ta:random(p-2);
tAnton:power_mod(g,ta,p);

Result

Berta

(%i10) tb:random(p-2);
tBerta:power_mod(g,tb,p);

Result

Tobi

(%i12) tt:random(p-2);
tTobi:power_mod(g,tt,p);

Result

Die Öffentliche Schlüsselliste ist nun

(%i14) tAnton; tBerta; tTobi;
Result

2 Hilfsfunktionen

(%i17) txToZoo(text):=block([i,li,intli,n,z],
                      li:charlist(text),n:length(li), intli:[],
                      for i:1 thru n do (
                         intli:append(intli,[cint(li[i])]) ), print(intli),
       intli:intli-28, print(intli),z:0,
                       for i:1 thru n do (z:z*100+intli[i]), return(z)
                      )$

(%i18) txToZoo("Affe");
Result

(%i19) zooToTx(z):=block([i,li,zz,tx],
                    intli:[],zz:z,tx:"",
                    for i:1 while zz>=1 do(
                       intli:append([mod(zz,100)],intli), zz:floor(zz/100)),
                    print(intli), intli:intli+28, print(intli),
                    for i:1 thru length(intli) do (tx:concat(tx,ascii(intli[i]))),
                    return(tx)
                    )$

(%i20) m:zooToTx(37747473);
Result

3 Sendung

Jeder der drei kann sich nun entschließen, den beiden anderen
etwas zu senden. Hier will Anton an Berta und Tobi eine geheime
Nachricht senden.

3.1 Vorbereitung

Anton wählt geheim ein a und bildet eine Zahl antonOffen,
der er zusammen mit der verschlüsselten Nachricht verschicken wird.

(%i21) a:random(p-2);
antonOffen:power_mod(g,a,p);

Result

Er berechnet für die Kommunikation mit Berta einen Schlüssel k_AB.
Er berechnet für die Kommunikation mit Tobi einen Schlüssel k_AT.

(%i23) k_AB:power_mod(tBerta,a,p);
k_AT:power_mod(tTobi,a,p);

Result

3.2 Verwendung der Nachricht

(%i36) m:txToZoo("Erster Montag 2012 um Zehn");
Result

(%i37) A_an_Berta:f(k_AB,m);
A_an_Tobi:f(k_AT,m);

Result

Achtung, Berta und Tobi erhalten für dieselbe Nachricht verschiedene
Kryptogramme.

3.3 Sendung

Berta erhält

(%i39) antonOffen;
A_an_Berta;

Result

Tobi erhält

(%i41) antonOffen;
A_an_Tobi;

Result

3.4 Empfang und Entschlüsselung

Berta stellt sich auch ihren Kommnuikationsschlüssel kb_AB
für Nachrichen von Anton her. Es ist derslbe Schlüssel wie k_AB.

(%i43) kb_AB:power_mod(antonOffen,tb,p);
is(kb_AB=k_AB);

Result

Berta rechnet

--> B_von_Anton:f_inv(kb_AB,A_an_Berta);
klarB:zooToTx(B_von_Anton);

Result

Tobi stellt sich auch seinen Kommnuikationsschlüssel kc_AT
für Nachrichen von Anton her. Es ist derslbe Schlüssel wie k_AT.

(%i45) kt_AT:power_mod(antonOffen,tt,p);
is(kt_AT=k_AT);

Result

Tobi rechnet

(%i47) T_von_Anton:f_inv(kt_AT,A_an_Tobi);
klarT:zooToTx(T_von_Anton);

Result

4 Signatur mit ElGamal= DSS

DSS= digital Signatur Standard, Anton will eine Nachricht
signieren, Berta und Tobi sollen sie verifizieren können

4.1 Offene Nachricht und Vorbereitung

(%i49) klar:"Vertraut Emil nicht!";
Result

(%i50) m:txToZoo(klar);
Result

Anton wählt eine Zahl ra teilerfremd zu p-1 und
bestimmt ihre Inverse ri bezüglich p-1.

(%i51) p;
Result

(%i52) ra:2$ while gcd(ra,p-1)#1 do ra:random(p-1)$ ra;
Result

(%i55) gcd(ra,p-1);
Result

(%i60) ri:gcdex(ra,p-1)[1]$ if ri<0 then ri:ri+p-1$ ri;
Result

Probe

(%i63) mod(ra*ri,p-1);
Result

(%i64) kra:power_mod(g,ra,p);
Result

4.2 Erzeugung der Signatur

(%i65) sa:mod((m-ta*kra)*ri,p-1);
Result

Anton sendet nun

--> [klar,m,sa,kra];
Result

4.3 Prüfung der digitalen Unterschrift

Jeder, der p,g und tAnton kennt, kann prüfen, ob dies
wirklich Antons Text ist.
Er berechnet zwei Zahlen und prüft, ob die gleich sind.

(%i72) test1:power_mod(g,m,p);
test2:mod(power_mod(tAnton,kra,p)*power_mod(kra,sa,p),p);

Result

(%i74) if test1=test2 then print("Anton hat wirklich geschrieben: ",klar)
   else print("Vorsicht, der Text ",zooToTx(m), " ist nicht von Anton")$

Result

4.4 Veränderung von m

(%i75) klarx:"Vertraut Emil!"$
m:txToZoo(klarx);

Result

(%i77) test1:power_mod(g,m,p);
test2:mod(power_mod(tAnton,kra,p)*power_mod(kra,sa,p),p);

Result

(%i79) if test1=test2 then print("Anton hat wirklich geschrieben: ",klar)
   else print("Vorsicht, der Text ",klarx, " ist nicht von Anton")$

Result


Created with wxMaxima.