Forum: Mikrocontroller und Digitale Elektronik Diffie-Hellman Schlüsselaustausch


von Mani (Gast)


Lesenswert?

Abend,

hat jemand von euch schon mal ein Programm für nen AVR programmiert, 
welches das Diffie-Hellman Prinzip anwendet? Muss mit einem Gerät 
kommunizieren, welches einen 128Bit Geheimschlüssel austauscht. Dumme 
Frage: Wie kann ich überhaupt eine 128Bit Primzahl generieren (für das 
Element p im DH-Prinzip)? Ein 16 Byte langes Array mit Zufallsprimzahlen 
von 0-255 erzeugen?

PS: geht das ganze mit nem 8-Bit µC? Geschwindigkeit ist egal!

Gruß, Mani

von André H. (andrekr)


Lesenswert?


von Mani (Gast)


Lesenswert?

Hi,

ok, hab den Coe mal ins AVR Studio reingeladen. Der Compiler schreit, 
dass er bcopy und bzero nicht findet. Hab gelesen, dass es diese 
Funktionen nicht mehr gibt, sondern ersetzt wurden durch welche in 
string.h.

bcopy z.B. durch memmove, aber der 10 Zeilen DH-Code verwendet des 
öfteren bcopy mit nur zwei statt der  3 benötigenten Argumente für 
memmove, was den Compiler zum meckern veranlasst.

Durch was kann ich die Funtionen bcopy und bzero ersetzten?


Mani

von Klaus W. (mfgkw)


Lesenswert?

ungetestet:
1
#include <string.h>
2
3
4
void bcopy( const void *src, void *dest, size_t n )
5
{
6
  memmove( dest, src, n );
7
}
8
9
void bzero( void *s, size_t n )
10
{
11
  memset( s, 0, n );
12
}

von Peter (Gast)


Lesenswert?

Mani schrieb:
> Ein 16 Byte langes Array mit Zufallsprimzahlen
>
> von 0-255 erzeugen?

da muss der Zufall aber gut sein, damit es am ende auch eine Primzahl 
wird. Ich kann mir nicht vorstellen das es in sinnvoller Zeit auf einem 
AVR (8-Bit Atmel) möglich ist.

von Klaus W. (mfgkw)


Lesenswert?

naja, von 0 bis 255 kann es ja nicht mehr als 254 Primzahlen
geben.
Die moderne Wissenschaft geht davon aus, daß es sogar eher
weniger sind.

Insofern würde ich schon auf akzeptable Rechenzeit tippen.

von Mani (Gast)


Lesenswert?

Ja das mit dem Array dachte ich mir schon, dass das nicht so gehen wird.

Den 10 Zeilen DH Code check ich gar nicht :-(

Wie programmiert man nun den 128 Bit Primzahlengenerator?

Hat keiner nen Code-Auszug wo mit nem Gerät Schlüssel mittels DH 
ausgetauscht werden?

Kann ich zum Austesten, also ob ich eine Kommunikation mit meinem Gerät 
hinbekomme, die Zufallszahl und die restlichen DH Variablen fix fertig 
deklarieren also die "Alice" Werte und mit den empfangengen Daten von 
"BOB" also meinem anzusteuernden Gerät weiterrechnen um einen 
gemeinsamen Schlüssel zu generieren?

Im Handbuch des Gerätes, steht, dass es bei jeder Kommunikation einen 
Key Wechsel geben soll um die Sicherheit zu erhöhen. Wenn ich jetzt aber 
immer die gleichen "ALICE" Daten sende, da mir momentan die 
Abhörsicherheit egal ist, hab ich halt immer den gleichen Schlüssel, 
kann das so funktionieren?

Der Schlüssel soll dann noch mittels AES mit den Nutzdaten verschlüsselt 
werden. Den 128 Bit AES Code hab ich mir schon mal aus diversen Foren 
zusammengestrickt, der funzt supa.



Sorry für die vielleicht "dummen" Fragen.

von Andreas F. (aferber)


Lesenswert?

Mani schrieb:
> Kann ich zum Austesten, also ob ich eine Kommunikation mit meinem Gerät
> hinbekomme, die Zufallszahl und die restlichen DH Variablen fix fertig
> deklarieren also die "Alice" Werte und mit den empfangengen Daten von
> "BOB" also meinem anzusteuernden Gerät weiterrechnen um einen
> gemeinsamen Schlüssel zu generieren?

Klar. Der Mathematik ist es egal, ob du jedesmal mit verschiedenen oder 
immer mit der gleichen Zufallszahl rechnest. Bietet nur dann eben ggf. 
keinen Schutz mehr.

> Im Handbuch des Gerätes, steht, dass es bei jeder Kommunikation einen
> Key Wechsel geben soll um die Sicherheit zu erhöhen. Wenn ich jetzt aber
> immer die gleichen "ALICE" Daten sende, da mir momentan die
> Abhörsicherheit egal ist, hab ich halt immer den gleichen Schlüssel,
> kann das so funktionieren?

Der Schlüssel wird nicht immer gleich sein, da ja die Zufallszahl von 
Bob auch mit einfliesst. Solange du die Zufallszahl von Alice 
geheimhalten kannst, und Bob einen ordentlichen Zufallszahlengenerator 
benutzt, ist das noch nichtmal unsicherer als ein "normaler" 
DH-Austausch. Allerdings kann ein Angreifer, wenn er irgendwann mal die 
Alice-Zahl herausbekommt. rückwirkend alle damit durchgeführten 
Schlüsselaustausche knacken.

Ohne weitere Massnahmen gegen Man-In-The-Middle (keine Ahnung ob dein 
Protokoll da etwas wirksames vorsieht) ist DH aber sowieso erstmal 
witzlos, also nur zu.

Andreas

von Arc N. (arc)


Lesenswert?

Mani schrieb:
> Abend,
>
> hat jemand von euch schon mal ein Programm für nen AVR programmiert,
> welches das Diffie-Hellman Prinzip anwendet? Muss mit einem Gerät
> kommunizieren, welches einen 128Bit Geheimschlüssel austauscht. Dumme
> Frage: Wie kann ich überhaupt eine 128Bit Primzahl generieren (für das
> Element p im DH-Prinzip)? Ein 16 Byte langes Array mit Zufallsprimzahlen
> von 0-255 erzeugen?

http://tools.ietf.org/html/rfc2631 (2.2.1.1.  Generation of p, q)

Test auf Primalität:
http://www.itl.nist.gov/fipspubs/fip186.htm (2.1. A PROBABILISTIC 
PRIMALITY TEST)

>
> PS: geht das ganze mit nem 8-Bit µC? Geschwindigkeit ist egal!

Die Laufzeit für den Test ist O(k log³ n) , n ist die zu testende Zahl, 
k die Anzahl der durchzuführenden Tests (sollte >= 50 sein)...

> Gruß, Mani

von Mani (Gast)


Lesenswert?

Grüß euch,

danke für die raschen Antworten.

@Andreas: Stimmt, der Schlüssel wird natürlich nicht immer gleich sein, 
da ja Bob's Werte immer anders sein werden, nur meine, also Alice Werte 
(p,g,a) und daraus folgend das Alpha (ist quasi öffentliche Schlüssel 
von Alice)bleibt gleich.

Wie gesagt, das Thema Abhörsicherheit interessiert mich momentan noch 
nicht, bin schon happy wenn ich mal eine gültige Kommunikation 
Herstellen kann.

@Arc Net: Vielen Dank für die Links, man findet ja immer wieder neue 
Seiten wo das DH beschrieben ist :-) Werd ich mir dann gleich mal 
durchlesen. Wie es mit der Geschindigkeit aussieht, dass muss ich mir 
noch angucken, dafür muss ich erst mal den von dir empf. Link 
durchlesen.

Wenn jemand noch weitere Vorschläge hat, nur her damit!

Dank euch vorerst mal!


Gruß Manfred

von Nosnibor (Gast)


Lesenswert?

Muß man denn beim Diffie-Hellman jedesmal eine neue Primzahl suchen?
Ich hätte jetzt gedacht, jemand legt den Generator und den Modulus 
einmal vorher allgemein fest (wobei jede Menge Rechenleistung zum 
Einsatz kommen kann, um sicherzustellen, daß der Modulus prim ist), so 
daß nachher zum Schlüsselaustausch auf jeder Seite nur noch eine 
Zufallszahl und zweimal modulo-Exponentiation nötig ist. Für einen 
8-Bitter ist das ja schon genug Arbeit.

von Hans H. (hanshein)


Lesenswert?

> Muß man denn beim Diffie-Hellman jedesmal eine neue Primzahl suchen?

Nein, Generator g und das prime p des Restklassenkoerpers sind
vor der Kommunikation konstant festgelegt. Beide Kommunikationsendpunkte
generieren eine (kryptographisch gute) Zufallszahl, es entsteht ein
shared master secret (vulgo "Schluessel"), --- aus dem nach einer
(normalerweise folgenden) Authentisierungsphase --- mit (i.d.R.)
kryptographischen Pseudozufallsfuntionen ("PRFs")
Schluessel fuer symmetrische und MAC-Verfahren generiert
werden... (i.d.R) fuer jeweils eine Richtung.

-> kryptographisch gute Zufallsfunktionen sind eine Schlangengrube!
-> im embedded Bereich hat man oft keine Minute(n) fuer einen
   regulaeren DH,  ECDH waere --- auch vom notwendigen
   RAM her --- die Alternative.
   Zur Inspiration:
   RFC4346 klaert und beschreibt die Schritte im
   TLS(/SSL ~ "https") Protokoll.

VG, Hans

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.