Code-Beispiel
RSA-Demo
Lizenz: | Erster Autor: | Letzte Bearbeitung: |
k. A. | schildron | 17.01.2012 |
RSA Demostration
Der folgende Beispielcode stellt die RSA-Verschlüsselungstechnik dar. Es lassen sich damit ganze Texte verschlüsseln, in der Regel wird RSA aber zur sicher Schlüsselübermittelung eingesetzt.
Der folgende Code wurde zwar vielfach getestet, vereinzelte Fehler sind aber dennoch nicht ausgeschlossen. Zum Verschlüsseln von hoch-kritischer Information verwenden Sie deshalb bitte eine 'professionelle' Softwarelösung.
bekannte Fehler:
Das Programm bleibt manchmal bei der Berechnung von e stecken.
Lösung:
Die Demo neu starten
'--------------------------------------
'--------------------------------------
'RSA-Demoprogramm
'2011 by Schildron
'FBC 0.23.0
'--------------------------------------
'--------------------------------------
#Include Once "big_int/big_int_full.bi"
#Ifndef NULL
#define NULL 0
#EndIf
Randomize Timer , 3
'--------------------------------------
'Print Funktion für big_int
'--------------------------------------
Sub print_num (ByVal num As big_int Ptr)
Dim As big_int_str Ptr s
s = big_int_str_create( 1 )
If( s = NULL ) Then
Exit Sub
End If
If( big_int_to_str( num, 10, s ) <> 0 ) Then
Exit Sub
End If
Print *s->Str
big_int_str_destroy( s )
End Sub
'--------------------------------------
'Big_Int in String umwandeln
'--------------------------------------
Function ToStr (ByVal num As big_int Ptr) As String
Dim As big_int_str Ptr s
s = big_int_str_create( 1 )
big_int_to_str( num, 10, s )
Return *s->Str
big_int_str_destroy( s )
End Function
'------------------------------------------
'Eingabe des Nutzers
'------------------------------------------
Dim As ULongInt Eingabe_Lange
Dim As ULongInt Position
Input "Primzahlenlänge eingeben [Stellen (min 5)]: ", Position
If Position < 5 Then Position = 5
Eingabe_Lange = Position
'------------------------------------------
'Generiere nachste Primzahlen
'------------------------------------------
Print "berechne Primzahlen..."
Dim As String String_ZielPrim, String_ZielPrim2
Dim As Double d_PrimLange
d_PrimLange = Position
For counter As Integer = 1 To Int(d_PrimLange*((Rnd*0.2)+0.8))
String_ZielPrim = String_ZielPrim & Str(Int(Rnd*10))
Next counter
Randomize Timer , 3
d_PrimLange = Position
For counter As Integer = 1 To Int(d_PrimLange*((Rnd*0.2)+0.8))
String_ZielPrim2 = String_ZielPrim2 & Str(Int(Rnd*10))
Next counter
'-------------------------
'String in big_int umwandeln
Dim As big_int Ptr big_PrimAusgang, big_PrimAusgang2
big_PrimAusgang = big_int_create( 1 )
big_PrimAusgang2 = big_int_create( 1 )
String_ZielPrim = RTrim(LTrim(String_ZielPrim)) 'leerzeichen vorne/hinten abfangen
String_ZielPrim2 = RTrim(LTrim(String_ZielPrim2)) 'leerzeichen vorne/hinten abfangen
Dim As big_int_str Ptr MyString
MyString = big_int_str_create( 1 )
big_int_str_copy_s( StrPtr( String_ZielPrim ), Len( String_ZielPrim ), MyString )
big_int_from_str(MyString,10,big_PrimAusgang)
big_int_str_copy_s( StrPtr( String_ZielPrim2 ), Len( String_ZielPrim2 ), MyString )
big_int_from_str(MyString,10,big_PrimAusgang2)
big_int_str_destroy(MyString)
'-----------------------------
'p,q,N berechnen
'-----------------------------
Print "berechne N..."
Dim As big_int Ptr big_p, big_q, big_N
big_p = big_int_create( 1 )
big_q = big_int_create( 1 )
big_N = big_int_create( 1 )
big_int_next_prime(big_PrimAusgang,big_p)
big_int_next_prime(big_PrimAusgang2,big_q)
big_int_mul(big_p,big_q,big_N)
'-----------------------------
'Eulische Zahl berechnen
'-----------------------------
Print "berechne Eulische Zahl..."
Dim As big_int Ptr big_Eulersche
big_Eulersche = big_int_create( 1 )
big_int_dec(big_p,big_p) '(p-1)
big_int_dec(big_q,big_q) '(q-1)
big_int_mul(big_p,big_q,big_Eulersche) '(Eulersche = (p-1)*(q-1))
'-----------------------------
'e berechnen
'-----------------------------
Print "berechne e..."
Print "Hinweis: Sollte das Programm genau *hier* etwas langer hangen, bitte neustarten"
Dim As big_int Ptr big_e, big_ggT
big_e = big_int_create( 1 )
big_ggT = big_int_create( 1 )
Do
'Zufallszahl berechnen
'-----------------------------
Dim As String String_ZielE
For counter As Integer = 1 To Position
String_ZielE = String_ZielE & Str(Int(Rnd*10))
Next counter
'-------------------------
'String in big_int umwandeln
String_ZielE = RTrim(LTrim(String_ZielE)) 'leerzeichen vorne/hinten abfangen
Dim As big_int_str Ptr MyString
MyString = big_int_str_create( 1 )
big_int_str_copy_s( StrPtr( String_ZielE ), Len( String_ZielE ), MyString )
big_int_from_str(MyString,10,big_e)
big_int_str_destroy(MyString)
'ggt berechnen
big_int_gcd(big_Eulersche,big_e,big_ggT)
Loop Until ToStr(big_ggT) = "1"
'-----------------------------
'd berechnen
'-----------------------------
Dim As big_int Ptr big_Temp_Mul, big_Position, big_d
big_Temp_Mul = big_int_create( 1 )
big_Position = big_int_create( 1 )
big_d = big_int_create( 1 )
Print "berechne d..."
big_int_invmod(big_e,big_Eulersche,big_d)
Print
Print "Fertig!"
Print
Print
'-----------------------------
'Errechnete Werte ausgeben
'-----------------------------
'Um 1 erhöhen, weil ffür Eulische Zahl erniedrigt
big_int_inc(big_p,big_p) '(p-1)
big_int_inc(big_q,big_q) '(q-1)
Print "p"
print_num(big_p)
Print "q"
print_num(big_q)
Print "N"
print_num(big_N)
Print "EUL"
print_num(big_Eulersche)
Print "e"
print_num(big_e)
Print "d"
print_num(big_d)
'-------------------------------
'VERSCHLÜSSELN
'-------------------------------
Dim Klartext As String
Dim Crypttext As String
Line Input "Text eingeben: ", Klartext 'Klartext eingeben
Dim As big_int Ptr big_PartToCryptKlar,big_Ergebnis
big_PartToCryptKlar = big_int_create( 1 )
big_Ergebnis = big_int_create( 1 )
Do
Dim As String PartToCryptKlar
PartToCryptKlar = Left(Klartext,1) 'Block herauslösen
Klartext = Right(klartext,Len(Klartext)-1)
big_int_from_int( Asc(PartToCryptKlar), big_PartToCryptKlar ) 'Char in Zahl umwandeln
big_int_powmod(big_PartToCryptKlar,big_e, big_N , big_Ergebnis ) 'PowMod
Dim As String PartToCryptCrypt
PartToCryptCrypt = ToStr(big_Ergebnis) 'big_int in String umwandeln
Crypttext = Crypttext & PartToCryptCrypt & " "
Loop Until Klartext = ""
Print
Print "Crypt: " & Crypttext 'Verschlüsselten Text ausgeben
big_int_destroy(big_Ergebnis)
'-------------------------------
'ENTSCHLÜSSELN
'-------------------------------
Klartext = ""
Dim As ULongInt TeilerPosition
Print
Do
Dim As String PartToCryptCrypt
TeilerPosition = InStr(Crypttext,Any" ")
PartToCryptCrypt = Left(Crypttext,TeilerPosition)
Crypttext = Right(Crypttext,Len(Crypttext)-TeilerPosition)
If PartToCryptCrypt = "" Or PartToCryptCrypt = " " Then Continue Do 'Ungültige werte abfangen
'-------------------------
'String in big_int umwandeln
PartToCryptCrypt = RTrim(LTrim(PartToCryptCrypt)) 'leerzeichen vorne/hinten abfangen
Dim As big_int Ptr big_PartToCryptCrypt, big_Ergebnis
big_PartToCryptCrypt = big_int_create( 1 )
big_Ergebnis = big_int_create( 1 )
Dim As big_int_str Ptr MyString
MyString = big_int_str_create( 1 )
big_int_str_copy_s( StrPtr( PartToCryptCrypt ), Len( PartToCryptCrypt ), MyString )
big_int_from_str(MyString,10,big_PartToCryptCrypt)
big_int_str_destroy(MyString)
'-------------------------
'Entschlüsseln
big_int_powmod(big_PartToCryptCrypt,big_d, big_N , big_Ergebnis )
Dim As ULongInt PartToCryptKlar
PartToCryptKlar = Val(ToStr(big_Ergebnis)) ''Gibt ToStrAusgabe zurück
Klartext = Klartext & Chr(PartToCryptKlar)
big_int_destroy(big_PartToCryptCrypt)
Loop While TeilerPosition <> 0
Print
Print "Entschlusselt: " & Klartext
'-------------------------------
'Alle noch verbleibenden Variablen aus dem Speicher entfernen
'-------------------------------
big_int_destroy(big_PrimAusgang)
big_int_destroy(big_PrimAusgang2)
big_int_destroy(big_p)
big_int_destroy(big_q)
big_int_destroy(big_N)
big_int_destroy(big_Eulersche)
big_int_destroy(big_e)
big_int_destroy(big_ggT)
big_int_destroy(big_Temp_Mul)
big_int_destroy(big_Position)
big_int_destroy(big_d)
big_int_destroy(big_PartToCryptKlar)
big_int_destroy(big_Ergebnis)
GetKey
Zusätzliche Informationen und Funktionen |
- Das Code-Beispiel wurde am 18.12.2011 von schildron angelegt.
- Die aktuellste Version wurde am 17.01.2012 von schildron gespeichert.
|
|