Hi Leute,
ich zeige euch heute wie ein Diffi-Hellman-Schlüsselaustausch funktioniert. Diese Methode benutzen 2 Kommunikationspartner in einem unsicherem Netz, damit dies keiner abhören kann. D.h. damit könntet ihr verschlüsselte Nachrichten austauschen, ohne das sie gelesen werden können. Ihr dürft sie natürlich nicht so in einem einfachen Client speichern, der kann sehr einfach dekompiliert werden.
Also guckt euch mal lieber den Wikipedia-Artikel an, der kann das besser erklären : D
Das Prinzip basiert darauf, das 2 Zahlen ausgetauscht werden können, die einem Abhörer nichts bringen. Die Partner können aber daraus einen Key berechnen. Der Key ist jedes Mal ein anderer -> Man kann ihn auch nicht aus dem Quellcode berechnen
So als erstes speichern beide Partner 2 konstante Zahlen ab, die bei beiden gleich sein muss! Die eine ist eine Primzahl p, die 2. ist eine sog. Primitivwurzel g, welche kleiner als die Primzahl - 2 sein muss.
Nehmen wir einfach mal wie im Wiki als Beispiel p = 13 und g = 2.
Als nächstes berechnen die beiden Partner unhabhängig voneinander eine Zufahlszahl a und b gennant
Jetzt rechnen sich die Partner eine eigene Zahl aus, zu a entsprechend A und zu b dann B
Was Modular_Pow ist, seht ihr unten im Spoiler.
So das sind unsere Zahlen die übertragen werden. Jetzt hat Partner 1 die Zahl _B und P2 die Zahl _A
Daraus können jetzt beide den Key k berechnen, dieser wird aber nicht übertragen!
Jetzt kommt bei beiden das gleiche raus, was man an dieser Formel sehen kann:
Sieht jetzt kompliziert aus, aber das müsst ihr euch nicht merken...
Ich habe auch mal eine ausführlichere Klasse dafür gebastelt:
Spoiler anzeigen
Ich hoffe ich konnte euch helfen! Das ganze ist natürlich auch in php, c/c++, java usw. verfügbar, das müsst ich euch dann selber machen.
mfG Nibel
E: Danke an pico, wurde geändert!
ich zeige euch heute wie ein Diffi-Hellman-Schlüsselaustausch funktioniert. Diese Methode benutzen 2 Kommunikationspartner in einem unsicherem Netz, damit dies keiner abhören kann. D.h. damit könntet ihr verschlüsselte Nachrichten austauschen, ohne das sie gelesen werden können. Ihr dürft sie natürlich nicht so in einem einfachen Client speichern, der kann sehr einfach dekompiliert werden.
Also guckt euch mal lieber den Wikipedia-Artikel an, der kann das besser erklären : D
Das Prinzip basiert darauf, das 2 Zahlen ausgetauscht werden können, die einem Abhörer nichts bringen. Die Partner können aber daraus einen Key berechnen. Der Key ist jedes Mal ein anderer -> Man kann ihn auch nicht aus dem Quellcode berechnen
So als erstes speichern beide Partner 2 konstante Zahlen ab, die bei beiden gleich sein muss! Die eine ist eine Primzahl p, die 2. ist eine sog. Primitivwurzel g, welche kleiner als die Primzahl - 2 sein muss.
Nehmen wir einfach mal wie im Wiki als Beispiel p = 13 und g = 2.
Als nächstes berechnen die beiden Partner unhabhängig voneinander eine Zufahlszahl a und b gennant
Jetzt rechnen sich die Partner eine eigene Zahl aus, zu a entsprechend A und zu b dann B
Was Modular_Pow ist, seht ihr unten im Spoiler.
So das sind unsere Zahlen die übertragen werden. Jetzt hat Partner 1 die Zahl _B und P2 die Zahl _A
Daraus können jetzt beide den Key k berechnen, dieser wird aber nicht übertragen!
Jetzt kommt bei beiden das gleiche raus, was man an dieser Formel sehen kann:
Sieht jetzt kompliziert aus, aber das müsst ihr euch nicht merken...
Ich habe auch mal eine ausführlichere Klasse dafür gebastelt:
VB.NET-Quellcode
- Public Class Diffi_Hellman_Key_Exchange
- Private p As Long
- Private g As Long
- Private a As Long
- Private _A As Long
- Private _B As Long
- Private K As Long
- Public Function Init(ByVal Prime_Number As Long, ByVal Primitive_Root As Long) As Long
- If Not Primitive_Root < (Prime_Number - 2) Then
- Return -1
- End If
- If Not Is_Prime_Number(Prime_Number) Then
- Return -1
- End If
- _B = -1
- K = -1
- p = Prime_Number
- g = Primitive_Root
- Dim r As New Random
- a = r.Next(1, p - 2)
- _A = Modular_Pow(g, a, p)
- Return _A
- End Function
- Public Function Is_Prime_Number(ByVal n As Long) As Boolean
- Dim b As Boolean = True
- For i As Integer = 2 To Int(Math.Sqrt(n))
- If (n Mod i = 0) Then
- b = False
- Return b
- End If
- Next i
- Return b
- End Function
- Public Function Modular_Pow(ByVal a As Long, ByVal b As Long, ByVal m As Long) As Long
- Dim result As Long = 1
- While b > 0
- If (b And 1) = 1 Then
- result = (result * a) Mod m
- End If
- b >>= 1
- a = (a * a) Mod m
- End While
- Return result
- End Function
- Public Function Calc_Key(ByVal Received_Number_B As Long) As Long
- _B = Received_Number_B
- K = Modular_Pow(_B, a, p)
- Return K
- End Function
- Public ReadOnly Property Prime_Number() As Long
- Get
- Return p
- End Get
- End Property
- Public ReadOnly Property Primitive_Root() As Long
- Get
- Return g
- End Get
- End Property
- Public ReadOnly Property Random_Number() As Long
- Get
- Return a
- End Get
- End Property
- Public ReadOnly Property Calculated_Value_A_To_Send() As Long
- Get
- Return _A
- End Get
- End Property
- Public ReadOnly Property Key() As Long
- Get
- Return K
- End Get
- End Property
- Public Property Received_Value_B() As Long
- Get
- Return _B
- End Get
- Set(ByVal value As Long)
- _B = value
- K = Calc_Key(value)
- End Set
- End Property
- Public Sub New()
- p = -1
- g = -1
- a = -1
- _A = -1
- K = -1
- _B = -1
- End Sub
- End Class
Ich hoffe ich konnte euch helfen! Das ganze ist natürlich auch in php, c/c++, java usw. verfügbar, das müsst ich euch dann selber machen.
mfG Nibel
E: Danke an pico, wurde geändert!
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nibel“ ()