Ich will an dieser Stelle die neue Version meines Programms vorstellen, an dem ich ab und zu etwas verändere, weil mir gelegentlich Ideen für Veränderungen einfach so einfallen.
Hier ist zunächst die Programmbeschreibung :
Mein Programm hat den Zweck , für das RSA-Verschlüsselungsverfahren die Entstehung der Schlüsselpaare, welche man zur Ver- und Entschlüsselung braucht, vorzuführen. Mein Programm funktioniert so, dass man 2 kleine Primzahlen in den ersten beiden TextBoxen eingibt und dann auf den Button 1 drückt. Dann wird einem eine Liste von 30 Zahlen vorgeschlagen, die sich dafür eignen, als Verschlüsselungsexponent e verwendet zu werden. Warum nur 30 ? Ich habe diese Grenze eingebaut, weil je größer die verwendeten Primzahlen werden, desto mehr mögliche e gibt es. Ich weiß das, weil die Anzahl der möglichen e in meinem Programm mitgezählt und ausgegeben wird . Ich wollte nicht, dass mein Programm nach dem Drücken von Button 1 zu viel Zeit braucht, um die Ausgabe der Liste von möglichen e zu erstellen. Wenn man sich für ein e entschieden hat, gibt man dieses e in die 3 te Textbox ein und denkt sich dann eine Zahl aus, die man verschlüsseln will und gibt diese in die 4 te Textbox ein. Danach drückt man auf den Button 3 damit man sehen kann wie schnell die Funktion getPrivateKey den Entschlüsselungs Exponenten d berechnen kann. Wenn man dann auf den Button 2 drückt wird einem der Entschlüsselungs Exponent d noch mal auf eine andere Art berechnet. Außerdem wird der Geheimtext berechnet. Wenn durch diese andere Art der Berechnung ein anderes d errechnet, wird als die Funktion getPrivateKey es getan hat, wird vorgeführt was für ein Klartext sich mit dem falschen d und dem richtigen d aus dem Geheimtext errechnen lässt. Wobei das Unterprogramm für Mod Berechnungen mit dem falschen d nur dann richtig rechnet, wenn der Exponent positiv ist. Leider funktioniert das Programm nur mit sehr kleinen Primzahlen, die nicht größer als 100 sein sollten, wenn die Berechnung nicht zu lange dauern soll. Der Vorteil an meinem Programm ist aber, dass man im Formular bevor man Button 2 drückt, nur einen Haken setzen muss um beide Lösungen der Gleichung e mal d + k mal Phi(N) = 1 sehen zu können. Allerdings dauert dann die Berechnung noch länger als wenn man nur eine Lösung sehen will.
Hier ist ein Beispiel bei denen beide Programme ein unterschiedliches d berechnen:
Wenn man mit den Primzahlen 127 und 131 ein Phi(N)= 16380 und ein e = 43
eingibt berechnet das Programm, was ich selbst geschrieben habe, für
d den Wert 11047 aus. Die Berechnung hat auf meinem PC 3 Minuten und
51 Sekunden gedauert, ohne dass ein Haken gesetzt wurde. Wenn der
Haken gesetzt wurde, dauert die Berechnung auf meinem PC 16 Minuten
und 33 Sekunden. die Funktion : getPrivateKey rechnet für d den Wert -5333 aus, kann
dieses Ergebnis aber sofort liefern.
Um das Programm ausführen zu können muss man sich zunächst das Programm Visual Studio 2022 herunterladen.
Das geht von der Seite: visualstudio.microsoft.com/de/
Danach muss man innerhalb des Programms Visual Studio als Projekt Typ: Windows Form App (.Net Framework)Visual Basic oder Windows Forms App Visual basic auswählen , genau weiß ich das nicht mehr so genau, ich vermute aber auch, dass es egal ist.
Hier ist der Formularentwurf, damit man sehen kann, wie ich die Buttons, Textboxen , Labels und die eine CheckBox gesetzt habe.
Wenn man auf dem Formularentwurf die Labels Buttons und Textboxen setzt, entstehen im Arbeitsbereich immer kleine Unterprogramme die mit Code aufgefüllt werden müssen. Der Code für die entstandenen Unterprogramme sowie der Rest meines Programmes kann einfach nur durch kopieren über die Zwischenablage nutzbar gemacht werden. Falls man den Code kopiert hat und das Projekt gestartet hat, kann man zum Beispiel die folgende Ausgabe sehen :
Hier ist nun der komplette Programmcode :
Spoiler anzeigen
*Topic verschoben, Spoiler-Tag eingefügt*
Hier ist zunächst die Programmbeschreibung :
Mein Programm hat den Zweck , für das RSA-Verschlüsselungsverfahren die Entstehung der Schlüsselpaare, welche man zur Ver- und Entschlüsselung braucht, vorzuführen. Mein Programm funktioniert so, dass man 2 kleine Primzahlen in den ersten beiden TextBoxen eingibt und dann auf den Button 1 drückt. Dann wird einem eine Liste von 30 Zahlen vorgeschlagen, die sich dafür eignen, als Verschlüsselungsexponent e verwendet zu werden. Warum nur 30 ? Ich habe diese Grenze eingebaut, weil je größer die verwendeten Primzahlen werden, desto mehr mögliche e gibt es. Ich weiß das, weil die Anzahl der möglichen e in meinem Programm mitgezählt und ausgegeben wird . Ich wollte nicht, dass mein Programm nach dem Drücken von Button 1 zu viel Zeit braucht, um die Ausgabe der Liste von möglichen e zu erstellen. Wenn man sich für ein e entschieden hat, gibt man dieses e in die 3 te Textbox ein und denkt sich dann eine Zahl aus, die man verschlüsseln will und gibt diese in die 4 te Textbox ein. Danach drückt man auf den Button 3 damit man sehen kann wie schnell die Funktion getPrivateKey den Entschlüsselungs Exponenten d berechnen kann. Wenn man dann auf den Button 2 drückt wird einem der Entschlüsselungs Exponent d noch mal auf eine andere Art berechnet. Außerdem wird der Geheimtext berechnet. Wenn durch diese andere Art der Berechnung ein anderes d errechnet, wird als die Funktion getPrivateKey es getan hat, wird vorgeführt was für ein Klartext sich mit dem falschen d und dem richtigen d aus dem Geheimtext errechnen lässt. Wobei das Unterprogramm für Mod Berechnungen mit dem falschen d nur dann richtig rechnet, wenn der Exponent positiv ist. Leider funktioniert das Programm nur mit sehr kleinen Primzahlen, die nicht größer als 100 sein sollten, wenn die Berechnung nicht zu lange dauern soll. Der Vorteil an meinem Programm ist aber, dass man im Formular bevor man Button 2 drückt, nur einen Haken setzen muss um beide Lösungen der Gleichung e mal d + k mal Phi(N) = 1 sehen zu können. Allerdings dauert dann die Berechnung noch länger als wenn man nur eine Lösung sehen will.
Hier ist ein Beispiel bei denen beide Programme ein unterschiedliches d berechnen:
Wenn man mit den Primzahlen 127 und 131 ein Phi(N)= 16380 und ein e = 43
eingibt berechnet das Programm, was ich selbst geschrieben habe, für
d den Wert 11047 aus. Die Berechnung hat auf meinem PC 3 Minuten und
51 Sekunden gedauert, ohne dass ein Haken gesetzt wurde. Wenn der
Haken gesetzt wurde, dauert die Berechnung auf meinem PC 16 Minuten
und 33 Sekunden. die Funktion : getPrivateKey rechnet für d den Wert -5333 aus, kann
dieses Ergebnis aber sofort liefern.
Um das Programm ausführen zu können muss man sich zunächst das Programm Visual Studio 2022 herunterladen.
Das geht von der Seite: visualstudio.microsoft.com/de/
Danach muss man innerhalb des Programms Visual Studio als Projekt Typ: Windows Form App (.Net Framework)Visual Basic oder Windows Forms App Visual basic auswählen , genau weiß ich das nicht mehr so genau, ich vermute aber auch, dass es egal ist.
Hier ist der Formularentwurf, damit man sehen kann, wie ich die Buttons, Textboxen , Labels und die eine CheckBox gesetzt habe.
Wenn man auf dem Formularentwurf die Labels Buttons und Textboxen setzt, entstehen im Arbeitsbereich immer kleine Unterprogramme die mit Code aufgefüllt werden müssen. Der Code für die entstandenen Unterprogramme sowie der Rest meines Programmes kann einfach nur durch kopieren über die Zwischenablage nutzbar gemacht werden. Falls man den Code kopiert hat und das Projekt gestartet hat, kann man zum Beispiel die folgende Ausgabe sehen :
Hier ist nun der komplette Programmcode :
VB.NET-Quellcode
- Public Class Form1
- Public a, b, R, c, m, pot, W, Q As Integer
- Public P As ULong
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim P, N, Z, x As Integer
- Dim moeg As String
- x = 0
- Q = 0
- moeg = " "
- P = (a - 1) * (b - 1)
- N = a * b
- For W = 1 To P
- If EUCLID_RECURSIVE(P, W) = 1 Then
- Q = Q + 1
- End If
- Next
- For Z = 1 To P
- If EUCLID_RECURSIVE(P, Z) = 1 And x < 30 Then
- x = x + 1
- moeg = moeg & " Der ggT von Phi( N) : " & P & " und e : " & Z & " = " & EUCLID_RECURSIVE(P, Z) & Chr(13)
- End If
- Next
- Label1.Text = "RSA Modul: N = p mal q = " & a & " mal " & b & " = " & N & Chr(13) _
- & " Phi (n) = (P-1) mal (q-1) = " & "(" & a & "-1) * (" & b & "-1) = " & P & Chr(13) _
- & " Wähle eine zu Phi (N) teilerfremde Zahl e , für die gilt 1 < e < Phi(N)" & Chr(13) _
- & " Ausserdem gilt das der ggt von e und Phi(N) = 1 " & Chr(13) _
- & " Es werden hier maximal die ersten 30 möglichen e aufgelistet " & Chr(13) _
- & "tatsächlich gibt es " & Q & " mögliche e " & Chr(13) & moeg & Chr(13) _
- & " wählen sie nun ein e aus der Liste aus" & Chr(13) _
- & "und geben es in das 3te Eingabefeld ein" & Chr(13) _
- & "dazu denken sie sich bitte eine Zahl aus," & Chr(13) _
- & " die sie verschlüsseln wollen und geben diese in das" & Chr(13) _
- & "4 te Eingabefeld ein und drücken dann auf den Button 3 " & Chr(13) _
- & " damit sie nach kurzer Zeit ein D ausgerechnet bekommen " & Chr(13) _
- & "und danach auf den Button 2 damit sie " & Chr(13) _
- & "eventuell ein anderes D ausgerechnet bekommen " & Chr(13)
- End Sub
- Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
- If IsNumeric(TextBox1.Text) = True Then
- a = CInt(TextBox1.Text)
- End If
- End Sub
- Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
- If IsNumeric(TextBox2.Text) = True Then
- b = CInt(TextBox2.Text)
- End If
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- Dim i, x, Y, k, d, N, KL1, KL2, C1, C2, DN, GA, GB, kla, klb, kln, DP, DQ, RP, RQ, ST, Unterschied, Min, Sek As Integer
- Dim Ausg, Zeit As String
- Dim Erg, P As Long
- Dim Zeit1, Zeit2 As Date
- ' Label1.Text = "" Falls man beim Setzen der Buttons und Labels mehr Platz braucht, würde dieser Befehl einen Sinn machen.
- Zeit1 = DateAndTime.Now
- N = a * b
- P = (a - 1) * (b - 1)
- If P > R Then
- Y = P
- Else
- Y = R
- End If
- Ausg = ""
- If CheckBox1.Checked = True Then
- ST = -Y
- Else
- ST = 1
- End If
- For i = ST To Y
- For x = ST To Y
- Erg = (i * R) - x * P
- If Erg = EUCLID_RECURSIVE(P, R) Then
- d = i
- k = -1 * x
- If d > 0 Then
- Ausg = Ausg & CStr(i) & " mal " & CStr(R) & " minus " & CStr(x) & " mal " & CStr(P) & " = " _
- & CStr(EUCLID_RECURSIVE(P, R)) & Chr(13)
- Else
- Ausg = Ausg & CStr(i) & " mal " & CStr(R) & " plus " & CStr(-x) & " mal " & CStr(P) & " = " _
- & CStr(EUCLID_RECURSIVE(P, R)) & Chr(13)
- End If
- Exit For
- Exit For
- End If
- Next
- Next
- RP = R Mod (a - 1)
- RQ = R Mod (b - 1)
- KL1 = m Mod a
- KL2 = m Mod b
- C1 = ModbermitPotenz(KL1, RP, a)
- C2 = ModbermitPotenz(KL2, RQ, b)
- c = China(C1, a, C2, b) Mod N
- 'oc = ModbermitPotenz(m, R, N) Kontrolle ob ohne chinesischen Restsatz die Rechnung das gleiche ergibt.
- Zeit2 = DateAndTime.Now
- Unterschied = DateAndTime.DateDiff(DateInterval.Second, Zeit1, Zeit2)
- If Unterschied > 60 Then
- Min = DateAndTime.DateDiff(DateInterval.Minute, Zeit1, Zeit2)
- Sek = Unterschied Mod 60
- Zeit = " Die Rechenzeit hat : " & Min & " Minuten und " & Sek & " Sekunden betragen" & Chr(13)
- Else
- Zeit = " Die Rechenzeit hat : " & Unterschied & " Sekunden betragen" & Chr(13)
- End If
- Label5.Text =
- " Es beginnt die Berechnung der Inversen zu e modulo Phi(N), es gilt :" & Chr(13) _
- & " d mal e + k mal Phi(N) = 1 " & Chr(13) _
- & Ausg & Chr(13) & "daraus folgt das d = " & d & " und k = " & k & Chr(13) _
- & " Um eine Nachricht m zu verschlüsseln, verwendet der Absender die Formel : " & Chr(13) _
- & "C= m hoch e Mod N und erhält so aus der Nachricht m den Geheimtext c , " _
- & Chr(13) & m & " Hoch " & R & " Mod " & N & "=" & c & Chr(13) _
- & " Das Chiffrat ist also " & c & Chr(13) _
- & " Der Geheimtext c kann durch modulare Exponentiation" & Chr(13) _
- & "wieder zum Klartext m entschlüsselt werden." & Chr(13) _
- & " Der Empfänger benutzt die Formel :" & Chr(13) _
- & " m = c hoch d Mod N mit dem nur ihm bekannten Wert d sowie N. " & Chr(13) _
- & c & " hoch " & d & " Mod " & N & "= " & m & " Der Klartext ist also " & m & Chr(13) _
- & Zeit
- DN = GetPrivateKey(R, P)
- If DN <> d Then
- DP = DN Mod (a - 1)
- DQ = DN Mod (b - 1)
- GA = c Mod a
- GB = c Mod b
- kla = ModbermitPotenz(GA, DP, a)
- klb = ModbermitPotenz(GB, DQ, b)
- kln = China(kla, a, klb, b) Mod N
- ' kont = ModbermitPotenz(c, DN, N) Kontrolle ob ohne chinesischen Restsatz die Rechnung das gleiche ergibt.
- Label6.Text = Label6.Text & Chr(13) & " Wenn man dieses andere D in die Formel : " & Chr(13) _
- & " m = c hoch d Mod N eingibt und das Chiffrat benutzt,
- was durch die Methode unter Button 2 berechnet wurde, " & Chr(13) _
- & "ergibt sich die folgende Rechnung : " & c & " hoch " & DN & " Mod " & N & Chr(13) _
- & " und es kommt der folgende Klartext heraus : " & CStr(kln) & Chr(13)
- ' & "Nur zur Kontrolle : Klartext ohne chinesischen Restsatz = " & kont
- End If
- End Sub
- Private Sub TextBox4_TextChanged(sender As Object, e As EventArgs) Handles TextBox4.TextChanged
- If IsNumeric(TextBox4.Text) = True Then
- m = CInt(TextBox4.Text)
- End If
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Label2.Text = " Ein Rechner für das Testen von 2 Primzahlen siehe :https://de.wikipedia.org/wiki/RSA-Kryptosystem
- Geben sie nun die beiden Primzahlen ein und drücken auf den Button 1
- Primzahl1 Primzahl2 "
- Label3.Text = " hier das e eingeben"
- Label4.Text = " hier kommt eine Zahl hin,
- die verschlüsselt werden soll"
- CheckBox1.Text = " Hier einen Haken setzen, wenn man 2 Lösungen
- der Gleichung: e mal d + k mal Phi (N) = 1 sehen will "
- Label1.Text = " Hier ist die Liste der ersten 32 Primzahlen
- Wenn sie sich die größeren Zahlen aus der Liste aussuchen,
- werden sie verstehen, weshalb ich bei Button 2 eine Zeitmessung
- in das Programm eingebaut habe :
- 2 , 3 ,5, 7
- 11, 13 , 17 , 19
- 23, 29, 31, 37,
- 41, 43, 47, 53,
- 59, 61, 67, 71,
- 73, 79, 83, 89,
- 97, 101, 103, 107
- 109, 113, 127, 131,"
- End Sub
- Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
- Dim P = (a - 1) * (b - 1)
- Label6.Text = "Durch die Funktion : getPrivateKey berechnetes D : " & GetPrivateKey(R, P) & Chr(13)
- End Sub
- Private Sub TextBox3_TextChanged(sender As Object, e As EventArgs) Handles TextBox3.TextChanged
- If IsNumeric(TextBox3.Text) = True Then
- R = CInt(TextBox3.Text)
- End If
- End Sub
- Function EUCLID_RECURSIVE(P, R) 'Unterprogramm zur Anwendung des euklidische Algorithmus
- ' von daher zur Berechnung des größten gemeinsamen Teilers zweier natürlicher Zahlen
- Dim Ergebnis As Integer
- If R = 0 Then
- Ergebnis = P
- Else
- Ergebnis = EUCLID_RECURSIVE(R, P Mod R)
- End If
- EUCLID_RECURSIVE = Ergebnis
- End Function
- Function China(a1, m1, a2, m2) 'Unterprogramm zur Anwendung des chinesischen Restsatz mit 2 Kongruenzen
- Static INV1, INV2, x, y, w, z, Erg
- Do
- INV1 = INV1 + 1
- x = m2 * INV1
- y = x Mod m1
- Loop Until (y = 1)
- Do
- INV2 = INV2 + 1
- w = m1 * INV2
- z = w Mod m2
- Loop Until (z = 1)
- Erg = (a1 * m2 * INV1) + (a2 * m1 * INV2)
- China = Erg
- End Function
- Private Function GetPrivateKey(R As Integer, P As Integer) As Integer
- Dim b As Integer = P 'Unterprogramm zur schnellen Ermittlung eines D
- Dim d As Integer = 1
- Dim u As Integer = 0
- While b <> 0
- Dim q As Integer = R / b
- Dim b1 As Integer = b
- b = R - q * b
- R = b1
- Dim u1 As Integer = u
- u = d - q * u
- d = u1
- End While
- Return d
- End Function
- Public Function ModbermitPotenz(a As Integer, b As Integer, n As Integer) 'Unterprogramm für Mod Berechnungen von Potenz- Zahlen
- Dim result As Integer = 1
- For i As Integer = 0 To b - 1
- result *= a
- result = result Mod n
- Next
- Return result
- End Function
- End Class
*Topic verschoben, Spoiler-Tag eingefügt*
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()