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
pycrypto
Ich habe RSA vor Jahren mal genutzt, um mit Javascript ein sicheres Login ohne SSL zu implementieren, hier mal die alte Python-Klasse:
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
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)
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.
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)
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
Das sieht schon eher nach Verschlüsselung aus.
Stefan
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)
Stefan
Auch bei Blockchiffren muss man padden, da die Daten sich selten an Blockgrenzen zu halten pflegen.