pycrypto

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
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Mittwoch 22. April 2009, 17:25

Hallo zusammen, ich versuche seit einigen Tagen mit dem >pycrypto< Modul klarzukommen, was mir aber nur zum Teil gelingt!! Mit AES, RC4 oder Blowfish habe ich keine großen Probleme, aber mit dem RSA / DSA Modul komme ich einfach nicht so wirklich hin.
Gibt es den keine ausführlichere Doku oder ein paar Praktische Beispielel?

Vielleicht hat ja einer von euch noch was in der Schublade, wäre echt klasse...!

Gruß
Stefan
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Mittwoch 22. April 2009, 18:31

Ich habe RSA vor Jahren mal genutzt, um mit Javascript ein sicheres Login ohne SSL zu implementieren, hier mal die alte Python-Klasse:

Code: Alles auswählen

from Crypto.PublicKey import RSA
from Crypto.Util import randpool

class MyRSAStuff:
    def __init__(self, key=None, bit=1024):
        self.key = key
        if not self.key:
            self.key = self.createKey(bit)

    def createKey(self, bit):
        rand = randpool.RandomPool()
        self.key = RSA.generate(bit, rand.get_bytes)

    # get a hex respresentation of the public key
    def getHexPublic(self):
        return(hex(self.key.__getstate__().get("n")).strip("0x").rstrip("L"))

    # decrypt a whitespace separated hex message
    def decryptHex(self, encrypted_phrase):
        decrypted_hex = ""
        for i in encrypted_phrase.split(" "):
            decrypted_long = self.key.decrypt(long(i, 16))
            decrypted_hex = hex(decrypted_long).strip("0x").rstrip("L") + decrypted_hex
        phrase = ""
        for i in range(len(decrypted_hex), 0, -2):
            phrase += chr( int(decrypted_hex[i-2] + decrypted_hex[i-1], 16) & 255)
        return(phrase)
Keine Ahnung, ob der Code noch funktioniert, auch ist die Klasse sehr speziell an das damalige Problem angepaßt und für Deine Belange unvollständig (die pythonseitige Encryption fehlt, da das Javascript machte). Vllt. hilfts Dir trotzdem weiter.

Dokumentation ist bei pycrypto wohl immernoch Fehlanzeige.

Grüße, Jerch
Zuletzt geändert von jerch am Mittwoch 22. April 2009, 18:41, insgesamt 1-mal geändert.
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Mittwoch 22. April 2009, 18:31

Code: Alles auswählen

import Crypto.PublicKey.RSA
import Crypto.Hash.MD5
import os
RSAkey = Crypto.PublicKey.RSA.generate(1024, os.urandom) #384, 512, 1024bit
hash_wert = Crypto.Hash.MD5.new('Hier kommt dann der Text rein!').digest()
signature = RSAkey.sign(hash_wert,  'Hier kommt die User-ID')
RSAkey.verify(hash_wert, signature)
So, habe jetzt hier einen text mit einem RSA verschlüsselt. Und wie kann ich das denn nun wieder entschlüsseln? Fragen über Fragen... ich weiß, ist für euch wohl alles nur kinderkram, aber ich bekomme es nicht hin!
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Mittwoch 22. April 2009, 18:34

Hallo jerch,
danke für die schnelle Hilfe!!
Ja, die Docu bei pycrypt lässt sehr zu wünschen übrig. Trotzdem Danke für den Code, da habe ich schon mal ein bischen was praktisches... :D
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 22. April 2009, 18:57

search, ich kenne zwar nicht pycrypto, aber an Sicherheit grenzender Wahrscheinlichkeit hast du mit deinem Beispiel keinen Text verschlüsselt, sondern einen MD5-Hash von einem Text berechnet und das dann signiert. Danach prüfst du die Signatur. Das ist keine Verschlüsselung.

Und falls das doch war, was du wolltest: MD5 sollte man möglichst nicht mehr verwenden. Nimm SHA1 oder einen der Nachfolger. Einen RSA-Schlüssel mit weniger als 1024 Bit würde ich auch nicht empfehlen.

Allgemein gilt: RSA ist keine gute Möglichkeit, um Texte zu verschlüsseln. Du kannst prinzip-bedingt sowie nie mehr Bits Daten verschlüsseln als wie der Schlüssel lang ist und wenn du weniger Bits hast, muss das das wissen bzw. ein bestimmtes Padding-Verfahren benutzen.

Für Daten beliebiger Länge sollte ein symmetrisches Verfahren wie AES mit einem geheimen Schlüssel benutzt werden und dann dieser Schlüssel mit einem asymmetrischen Verfahren wie RSAES oder RSASA-PSS verschlüsselt werden. Oder man nimmt das (möglicherweise patentierte) Verfahren, welches Handys für ihr DRM einsetzen namens RSAES-KEM-KDF2-KW-AES128, das ich mir aufgrund des langen Namens so gut merken kann ;)

Google sagt übrigens

Code: Alles auswählen

privkeyA = RSA.generate(...)
pubkeyA = privkeyA.publickey()
encrypted_msg = pubkeyB.encrypt(msg, '')
decrypted_msg = privkeyB.decrypt(encrypted_msg)
Das sieht schon eher nach Verschlüsselung aus.

Stefan
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Mittwoch 22. April 2009, 18:59

@jerch: return ist ein Statement und keine Funktion (die Klammern stören nicht, sind aber unnötig).
lunar

Mittwoch 22. April 2009, 18:59

Auch bei Blockchiffren muss man padden, da die Daten sich selten an Blockgrenzen zu halten pflegen.
search
User
Beiträge: 67
Registriert: Donnerstag 24. April 2008, 10:03
Wohnort: In Deutschland

Mittwoch 22. April 2009, 19:11

Hallo sma,
hast ja recht, wollte keinen text verschlüsseln (falsch geschrieben!)
Ach das mit MD5 und RSA wusste ich nicht. Danke für den Tip!
Gruß
Stefan
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Donnerstag 23. April 2009, 09:02

@derdon:
Alte dumme Angewohnheit ;)

Auch weiß ich nicht mehr, was mich damals geritten hat, die Entschlüsselung über die long- und nicht über die Bytestring-Respräsentation vorzunehmen. (Wohl zu arithmetisch gedacht)
Antworten