RSA-Verfahren Programm

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Panguan
User
Beiträge: 2
Registriert: Donnerstag 17. Januar 2013, 15:09

Hallo,

Ich habe ein (paar) Probleme mit meinem Programm.
Es geht um das RSA- Verfahren.
1) Ich verstehe nicht warum meine Verschlüsselungsfunktion nicht funtkioniert.
2) Wie kann ich auf meine Funktionen zugreifen und mit den return-Werten weiterarbeiten(siehe Funktion rsaverfahren)?
3) Wie kann ich später den verschlüsselten Text wieder in einen normal lesbaren Text umwandeln, wenn ich nur noch eine große Zahl habe?

Hier eine Seite an der ich mich orientiere.
http://www.inf-schule.de/index.php?vers ... larepotenz
  • Code: Alles auswählen

    p = 7
    q = 11
    e = 17
    n=p*q
    phin=(p-1)*(q-1)
    klartext = "RSA VERFAHREN"
    
    
    def formatieren(textzumformatieren):
        textzumformatieren=textzumformatieren.lower()
        formatiertertext = ""
        for i in textzumformatieren:
            if ord(i) != 32:
                formatiertertext += i
    
        return formatiertertext
           
           
       
    def stringtoascii(stringtoasciitext):
        asciitext = []
        for i in stringtoasciitext:
            asciitext.append(ord(i))
           
        return asciitext
    
    def verschluesseln(zahlzumverschlüsseln,e,n):
        verschluesseltertext = ""
        for i in zahlzumverschlüsseln[:]:
            print(i)
            verschluesseltertext = verschluesseltertext + str((i**e)%n)
    
        return verschluesseltertext
           
           
       
    def teilbarkeit(zahl2,zahl1):
        if zahl2 % zahl1 == 0:
            print("Zahl " + str(zahl1) + " ist ein Teiler von " + str(zahl2))
            return 1
        else:
            print("Zahl " + str(zahl1) + " ist kein Teiler von " + str(zahl2))
            return 0
    
    
    
    def rsaverfahren(klartext, p, q, e, n, phin):
        test = teilbarkeit(phin,e)
        if test == 1:
           quit
        else:
            print("test")
           
    
    print(verschluesseln([ord("a"),ord("b"),ord("c")],e,n))
    """
    print(formatieren(klartext))
    print(stringtoascii())
    print(verschluesseln([10],e,n))
    """
    
    

Mfg
Panguan
Zuletzt geändert von Panguan am Donnerstag 17. Januar 2013, 18:08, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Du solltest erstmal eine Funktion schreiben, welche genau eine Zahl verschlüsselt und eine Funktion, welche genau eine Zahl entschlüsselt. Der Rest ist dann einfach.

Allerdings würde man deinen Ansatz nie so verwenden. Typischerweise verschlüsselt man Text mit einem symmetrischen Schlüssel, welchen man mittels RSA verschlüsselt und an die andere Seite schickt. Die symmetrisch verschlüsselte Nachricht kann man dann über eine unsichere Leitung übertragen.

Ist der Text nicht allzu lang, dann kann man daraus auch einen einzigen Integer erstellen, diesen mittels RSA verschlüsseln und verschicken.
Das Leben ist wie ein Tennisball.
Panguan
User
Beiträge: 2
Registriert: Donnerstag 17. Januar 2013, 15:09

Ich hatte eine Verschlüsselungsfunktion, die ging aber bis eben nicht.
Das hab ich jetzt aber hinbekommen.
Die anderen Funktionen braucht man doch auch...
Was ist an meinem Ansatz nicht richtig deiner Meinung nach?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Panguan hat geschrieben:Was ist an meinem Ansatz nicht richtig deiner Meinung nach?
Du verschlüsselst jedes Zeichen mit dem selben Schlüssel. Das bedeutet, dass deine Verschlüsselung damit sofort wertlos ist, da man auf den verschlüsselten Daten problemlos eine Häufigkeitsanalyse durchführen kann. Zumindest bei Texten. Daher meine Hinweise zum symmetrischen Ansatz oder zur Umwandlung in einen Integer. Letzteres kanns du so umsetzen:

Code: Alles auswählen

WIDTH = 32

def string_to_integer(s):
    data = 0
    
    #data
    for c in s:
        data = (data << 8) | ord(c)
    
    #number of bytes
    return (data << WIDTH) | len(s)


def integer_to_string(i):
    #extract length
    l = i & ((1 << WIDTH) - 1)
    
    #extract data
    return "".join(chr((i >> (WIDTH + j*8)) & 255) for j in xrange(l))[::-1]


if __name__ == "__main__":
    o = "spam, ham and eggs"
    i = string_to_integer(o)
    s = integer_to_string(i)

    print "original =", o
    print "integer =", i
    print "string =", s
i kannst du nun problemlos verschlüsseln. Du solltest allerdings auf die Optimierung der Modularen Exponentiation zurückgreifen. Sonst kann das Verfahren mal länger dauern ;-) Wenn du es nicht selber mal implementieren möchtest, dann schau dir die pow-Funktion von Python mal genauer an.
Das Leben ist wie ein Tennisball.
Antworten