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.
|
Visual Basic Quellcode
|
1
2
3
|
'Bei beiden Partnern
Dim p As Integer = 13
Dim g As Integer = 2
|
Als nächstes berechnen die beiden Partner unhabhängig voneinander eine Zufahlszahl a und b gennant
|
Visual Basic Quellcode
|
1
2
3
4
|
' Beim Partner 1
Dim a As Integer = random.Next(1, p-2)
'Bei Partner 2
Dim b As Integer = random.Next(1, p-2)
|
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.
|
Visual Basic Quellcode
|
1
2
3
4
|
'Partner 1
Dim _A As Integer = Modular_Pow(g, a, p)
'Partner 2
Dim _B As Integer = Modular_Pow(g, b, p)
|
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!
|
Visual Basic Quellcode
|
1
2
3
4
|
'Partner 1
K = Modular_Pow(_B, a, p)
'Partner 2
K = Modular_Pow(_A, b, p)
|
Jetzt kommt bei beiden das gleiche raus, was man an dieser Formel sehen kann:
|
Quellcode
|
1
2
|
K = B^a mod p = ( g^b mod p)^a mod p = g^(b*a) mod p = g^(a*b) mod p
K = A^b mod p = ( g^a mod p)^b mod p = g^(a*b) mod p
|
Sieht jetzt kompliziert aus, aber das müsst ihr euch nicht merken...
Ich habe auch mal eine ausführlichere Klasse dafür gebastelt:
Hier klicken für weitere Informationen
|
Visual Basic Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
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!