2013-07-08 7 views
7

Ich bin sehr neu in der Verschlüsselung, ich muss eine einfache Zeichenfolge wie 'ABC123' in etwas ähnlich zu dem '3d3cf25845f3aae505bafbc1c8f16d0bfdea7d70f6b141c21726da8d' codieren.wie eine einfache Zeichenfolge zu codieren/zu decodieren

Ich versuchte zunächst, dies:

>>> import base64 
>>> q = 'ABC123' 
>>> w = base64.encodestring(q) 
>>> w 
'QUJDMTIz\n' 

Aber es ist zu kurz, ich etwas länger brauchen, als ich dies versucht:

>>> import hashlib 
>>> a = hashlib.sha224(q) 
>>> a.hexdigest() 
'3d3cf25845f3aae505bafbc1c8f16d0bfdea7d70f6b141c21726da8d' 

Das ist gut, aber jetzt weiß ich nicht, wie um es zurück zu konvertieren. Wenn jemand mir helfen kann, mit diesem Beispiel zu beginnen oder etwas anderes vorzuschlagen, wie ich eine kleine Schnur in etwas länger kodieren/decodieren könnte, wäre das großartig.

UPDATE

basierend auf plockc Antwort habe ich dies, und es scheint zu funktionieren:

from Crypto.Cipher import AES # encryption library 

BLOCK_SIZE = 32 

# the character used for padding--with a block cipher such as AES, the value 
# you encrypt must be a multiple of BLOCK_SIZE in length. This character is 
# used to ensure that your value is always a multiple of BLOCK_SIZE 
PADDING = '{' 

# one-liner to sufficiently pad the text to be encrypted 
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * PADDING 

# one-liners to encrypt/encode and decrypt/decode a string 
# encrypt with AES, encode with base64 
EncodeAES = lambda c, s: base64.b64encode(c.encrypt(pad(s))) 
DecodeAES = lambda c, e: c.decrypt(base64.b64decode(e)).rstrip(PADDING) 

# create a cipher object using the random secret 
cipher = AES.new('aaaaaaaaaa123456') 

# encode a string 
encoded = EncodeAES(cipher, 'ABC123') 
print 'Encrypted string: %s' % encoded 

# decode the encoded string 
decoded = DecodeAES(cipher, encoded) 
print 'Decrypted string: %s' % decoded 
+4

Das ist nicht, was ein Hash bedeutet. – SLaks

+2

Sicherheit ist _hard_. Welches Szenario versuchst du zu verteidigen? – SLaks

+0

Ich muss eine Konto-ID in etwas länger kodieren und es dann entschlüsseln, wenn ich es brauche. – Vor

Antwort

3

Sie müssen wahrscheinlich auf erarbeiten, wie Sie es verwenden wollen und warum, wie Sie gerade Öffnen der Büchse der Pandora :)

Eine Kodierung ist reversibel und sollte nur verwendet werden, um Daten in etwas anderes zu passen (wie Base 64 Binärdaten, wenn Sie nur Text verwenden können), ein Hash (wie Sha224) soll nicht sein reversibel.

Wenn Sie einen Benutzer verifizieren wollen, der ein Passwort eingibt, hashen Sie ihn (mit like sha224) und speichern Sie den Hash. Wenn der Benutzer das Passwort erneut eingibt, hashen Sie den Eintrag und vergleichen ihn. Dies ist die vereinfachte Version, Sie müssen auch "salt" hinzufügen, um einen einfachen "Wörterbuchangriff" zu vermeiden. Ich werde nicht näher darauf eingehen, denn das war nicht die Frage, die Sie gestellt haben.

Um Ihre Frage schnell zu beantworten, möchten Sie eine Verschlüsselungsbibliothek, wie die Chiffre AES-128, die einen geheimen Schlüssel hat und mit dem Schlüssel können Sie die ursprünglichen Daten wiederherstellen. Es wird einige Details in der Bibliothek geben, wie der Schlüssel erstellt werden kann (er muss eine bestimmte Länge haben und wird manipuliert, um diese Länge zu erhalten). Wenn Ihr Schlüssel auf einfachen Passwörtern basiert, schauen Sie sich PBKDF2 an, das aus einem schwachen Passwort einen starken Verschlüsselungsschlüssel macht.

Nicht verwechseln hmac als Verschlüsselung (hmac verwendet eine andere Funktion, wie die Hash-Funktion sha224), wenn der Empfänger einer Nachricht einen hmac-Schlüssel mit dem Absender teilt, können sie "authentifizieren", dass die Nachricht vom Absender kann und es kam ohne Veränderung.

Viel Glück!

P.S. hier ist ein gutes Buch, wenn Sie wirklich in graben beginnen sollen: Cryptography-Engineering: Design-Prinzipien und praktische Anwendungen

eine beliebte ähnliche Antwort: https://stackoverflow.com/a/4948393/1322463

Wikipedia zu gut Artikel hat.

+0

genial! Vielen Dank – Vor