Ich habe ein kleines Programm geschrieben, welches den Zweck hat für das RSA Verschlüsselungsverfahren die Entstehung der Schlüsselpaare, welche man zur Ver und Entschlüsselung braucht, vorzuführen. Es 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. Wenn man sich für ein „ e „ entschieden hat, gibt man dieses in die 3te Textbox ein und denkt sich dann eine Zahl aus, die man verschlüsseln will und gibt diese in die 4 te
Textbox ein. Wenn man dann auf den Button 2 drückt wird einem der Entschlüsselungsexponent „ d „ berechnet. 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. Eine Idee, die ich hätte, um die Berechnungen unter dem Button 2 etwas zu beschleunigen, wäre eine andere Konstruktion der Doppelschleife. Anstatt von 2 For Next Schleifen würde ich lieber eine Do Loop Anweisung mit until oder while Bedingung benutzen, um die 2 Variablen zu berechnen. Mein Versuch die Schleifen :
Zu ersetzen durch
schlägt fehl.
Laut dem Link : Do...Loop-Anweisung - Visual Basic | Microsoft Docs ist es egal, wie ich die Until Schleife aufbaue, ob das Until oder while am Kopf oder am Ende der Schleife steht.
Es macht auch keinen Unterschied ob ich x = x+1 und i= i +1 oder ob ich x+= 1 und i += 1 schreibe, es funktioniert nicht. Unter dem Link :Geschachtelte Steuerungsstrukturen - Visual Basic | Microsoft Docs gibt es auch nur ein Beispiel für 2 verschachtelte For Next Schleifen, aber nicht für eine verschachtelte Do until Loop Konstruktion. Kann es sein, dass es in Visual Basic gar nicht möglich ist, das zu konstruieren ? Hier ist nochmal der komplette Programmcode :
Textbox ein. Wenn man dann auf den Button 2 drückt wird einem der Entschlüsselungsexponent „ d „ berechnet. 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. Eine Idee, die ich hätte, um die Berechnungen unter dem Button 2 etwas zu beschleunigen, wäre eine andere Konstruktion der Doppelschleife. Anstatt von 2 For Next Schleifen würde ich lieber eine Do Loop Anweisung mit until oder while Bedingung benutzen, um die 2 Variablen zu berechnen. Mein Versuch die Schleifen :
Zu ersetzen durch
schlägt fehl.
Laut dem Link : Do...Loop-Anweisung - Visual Basic | Microsoft Docs ist es egal, wie ich die Until Schleife aufbaue, ob das Until oder while am Kopf oder am Ende der Schleife steht.
Es macht auch keinen Unterschied ob ich x = x+1 und i= i +1 oder ob ich x+= 1 und i += 1 schreibe, es funktioniert nicht. Unter dem Link :Geschachtelte Steuerungsstrukturen - Visual Basic | Microsoft Docs gibt es auch nur ein Beispiel für 2 verschachtelte For Next Schleifen, aber nicht für eine verschachtelte Do until Loop Konstruktion. Kann es sein, dass es in Visual Basic gar nicht möglich ist, das zu konstruieren ? Hier ist nochmal der komplette Programmcode :
VB.NET-Quellcode
- Public Class Form1
- Public a, b, R, c, m, pot 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
- Dim Zeit1, Zeit2 As Date
- Dim Unterschied As Long
- Zeit1 = DateAndTime.Now
- x = 0
- moeg = " "
- P = (a - 1) * (b - 1)
- N = a * b
- 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
- Zeit2 = DateAndTime.Now
- Unterschied = DateAndTime.DateDiff(DateInterval.Second, Zeit1, Zeit2)
- 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 hier sind ein par Vorschläge für mögliche e" & Chr(13) & moeg & Chr(13) _
- & " wählen sie nun ein e aus der Liste aus und geben es in das 3te Eingabefeld ein, dazu denken sie sich bitte eine Zahl aus," & Chr(13) _
- & " die sie verschlüsseln wollen und geben diese in das 4 te Eingabefeld ein und drücken auf den Button 2 " & Chr(13) _
- & " Die Rechenzeit für die Erstellung der Liste der möglichen e hat : " & Unterschied & " Sekunden betragen"
- 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 As Integer
- Dim Ausg As String
- Dim Erg, P As Long
- 'Dim Bo As Boolean
- Dim Zeit1, Zeit2 As Date
- Dim Unterschied As Long
- Zeit1 = DateAndTime.Now
- N = a * b
- P = (a - 1) * (b - 1)
- If P > R Then
- Y = P
- Else
- Y = R
- End If
- Ausg = ""
- 'Bo = False
- 'x = 0
- 'i = 0
- 'Do
- 'x = x + 1
- 'i = i + 1
- For i = 1 To Y
- For x = 1 To Y
- Erg = i * R - x * P
- If Erg = EUCLID_RECURSIVE(P, R) Then
- d = i
- k = -1 * x
- 'Bo = True
- Ausg = Ausg & CStr(i) & " mal " & CStr(R) & " minus " & CStr(x) & " mal " & CStr(P) & " = " _
- & CStr(EUCLID_RECURSIVE(P, R)) & Chr(13)
- End If
- 'Loop Until Bo = True
- Next
- Next
- KL1 = m Mod a
- KL2 = m Mod b
- C1 = ModbermitPotenz(KL1, R, a)
- C2 = ModbermitPotenz(KL2, R, b)
- c = China(C1, a, C2, b) Mod N
- Zeit2 = DateAndTime.Now
- Unterschied = DateAndTime.DateDiff(DateInterval.Second, Zeit1, Zeit2)
- 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 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 & " Das Chiffrat ist also " & c & Chr(13) &
- " Der Geheimtext c kann durch modulare Exponentiation wieder zum Klartext m entschlüsselt werden." & Chr(13) _
- & " Der Empfänger benutzt die Formel 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) _
- & " Die Rechenzeit hat : " & Unterschied & " Sekunden betragen" & Chr(13)
- 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"
- 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 ModbermitPotenz(m, pot, N) 'Unterprogramm zur Ausführung von Mod Berechnungen für Zahlen mit Potenzen
- Static x, y, Z As Integer
- Static Produkt(pot + 10) 'Feld anlegen
- Produkt(0) = m 'initialisieren
- For x = 0 To pot
- y = (Produkt(x) * m)
- Z = y Mod N
- Produkt(x + 1) = Z
- Next
- Return Produkt(pot - 1)
- 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
- End Class