Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Verschlüsselung

RSA-Demo

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Mitgliedschildron 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 Mitgliedschildron angelegt.
  • Die aktuellste Version wurde am 17.01.2012 von Mitgliedschildron gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen