# Diffie-Hellman-Schlüsselvereinbarung

Mathematik in wxMaxima www.mathematik-verstehen.de Haftendorn Dez 2010

### 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,
werte alle Zellen mit Strg r aus ( auch Menu Cell Alle Zellen auswerten).

### Inhalt

1   Erzeugung des gemeinsamen Schlüssels
    1.1 Verabredung der Grundlagen p  und g
    1.2 Erzeugung der geheimen Zahlen
    1.3 Austausch der Potenzen
    1.4 Potenzierung der erhaltenen Zahlen
2   Hilfsfunktionen   !!!!! Zuerst auswerten und wieder zuklappen !!!!
3   Symmetrische Verschlüsselung mit One-Time-Pad
3   Angriffe

## Erzeugung des gemeinsamen Schlüssels

### Verabredung der Grundlagen

Anton und Berta verabreden (offen) eine Primzahl p und eine 
kleinere Zahl g.

p:next_prime(floor(sqrt(random(1.0)*10^160)));
10^80;

g:random(p);

### Jeder für sich erzeugt seine geheime Zahl

anton:random(p); berta:random(p);

### Jeder schickt dem Anderen seine Potenz von g

alpha:power_mod(g,anton,p); beta:power_mod(g,berta,p);

### Jeder potenziert das Empfangene 

ka:power_mod(beta,anton,p); kb:power_mod(alpha,berta,p);

Nun haben beide denselben Schlüssel, nämlich ka=kb.

## Hilfsfunktionen

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)
                      )$

txToZoo("Affe");

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)
                    )$

m:zooToTx(37747473);

zToLi(z):=block([i,li,zz],
             li:[],zz:z,
             for i:1 while (zz>=1 ) do ( li:append(li,[mod(zz,10)]), zz:floor(zz/10)),
             return(reverse(li))
             )$

zToLi(565437);

otp_en(m,k):=  block([i,z,li], z:0,
                        mli:zToLi(m), kli:zToLi(k),/* print(mli), print(kli),*/
                        if length(mli)>length(kli) then ( 
                             return("Schlüssel zu kurz")),
                        for i:1 thru length(mli) do( z:(z*10+mod(mli[i]+kli[i],10))),
                        return(z)
                        )$

otp_de(c,k):=block([i,z,li], z:0,
                        cli:zToLi(c), kli:zToLi(k), /*print(cli), print(kli),*/
                        for i:1 thru length(cli) do( z:(z*10+mod(cli[i]-kli[i],10))),
                        return(z)
                        )$

## Symmetrische Kommunikation mit One-time-pad

### Verschlüsseln mit One-time-pad und gemeinsamem Schlüssel

Anton will eine Nachricht an Berta senden

m:txToZoo("Wollen wir Weihnachten Skifahren?");

m;ka;

Nun werden die Nachricht m und der Schlüssel ka ziffernweise modulo 10 addiert.

c:otp_en(m,ka);

Dieses c sendet Anton an Berta

### Entschlüsselung nit One-Time-Pad und gemeinsamem Schlüssel

Berta erhält von Anton das c

c; kb;

Berta zieht nun Ziffernweise von links modulo 10 von c den Schlüssel ab.

mm:otp_de(c,ka);

zooToTx(mm);

## Angriffe 

/* bis 10000 dauert 8 sec bei p 80 Stellen*/
block( for  i:1 thru 100 do( a:random(p),
                              if power_mod(g,random(p),p)=alpha then print( a, " gefunden") ),
                              print( " Pech, nicht gefunden"))$