2017-03-13 2 views
1

Ich versuche, einen Zeitstempel mit AES-256 und Python mit Base64 zu verschlüsseln. Der OpenSSL-Äquivalent des Ausgangs wird mit diesem Befehl erzeugt:Verschlüsseln mit AES-256 wie OpenSSL mit PyCrypto

openssl enc -aes256 -pass pass:'1Lw2*kx18#AvNuij*iRL1nY1UA_#k8$+' -nosalt -base64 <<< "1489355323" 

Mein Python-Code sieht so aus:

import time 
from base64 import b64encode 
from Crypto.Cipher import AES 

key = '1Lw2*kx18#AvNuij*iRL1nY1UA_#k8$+' 
timestamp = "1489355323" 

BS = 16 
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) 
iv = "\x00" * 16 

aes = AES.new(key, AES.MODE_CBC, iv) 
ciphertext = aes.encrypt(pad(timestamp)) 

print b64encode(ciphertext) 

Zur Zeit der Ausgang ist anders, und ich brauche die gleiche Ausgabe wie die OpenSSL zu erhalten Befehl. Irgendeine Idee, was ich falsch mache?

+0

Welche Krypto-Bibliothek verwenden Sie? – glibdud

+0

pycrypt. Ich habe meinen Code aktualisiert, um Importe zu enthalten. – Petru

+1

Ich habe das Gefühl, dass dies ein Passwort-vs-Schlüssel-Problem ist, aber ich kann nicht damit spielen, da ich im Moment nicht auf die PyCrypto-Dokumente zugreifen kann. Versuchen Sie vielleicht, die '-K' und' -iv' Optionen in openssl anstelle von '-pass' zu verwenden und sehen Sie, ob das passt? – glibdud

Antwort

3

Der Schlüssel und iv, die der Befehl OpenSSL enc verwendet, werden vom Kennwort durch die EVP_BytesToKey-Funktion abgeleitet. Sie müssen diese Funktion reproduzieren, damit sich der Code auf die gleiche Weise verhält.

In Python könnte es wie folgt aussehen:

from hashlib import md5 

# ... 

last = '' 
bytes = '' 

# 32 byte key (256 bits) + 16 byte IV = 48 bytes needed 
while len(bytes) < 48: 
    last = md5(last + password).digest() 
    bytes += last 

key = bytes[0:32] 
iv = bytes[32:48] 

# ... 

aes = AES.new(key, AES.MODE_CBC, iv) 
ciphertext = aes.encrypt(pad(timestamp)) 

Dieses Schema nicht mehr wirklich zu empfehlen, aber der enc Befehl es noch verwendet. Ich glaube, dass OpenSSL in Zukunft eine aktuellere Schlüsselableitungsfunktion bereitstellen wird.

Sie müssen auch auf Zeilenumbrüche achten. Die hier string (<<<) fügt eine neue Zeile an das Ende der Zeichenfolge, würden Sie, dass auf den String hinzufügen müssen Sie identische Ergebnisse erhalten verschlüsseln:

timestamp = "1489355323\n" 
+1

+1 Beachten Sie auch, dass Sie die "-P" -Option zu "openssl enc" hinzufügen können, um zu sehen, welchen Schlüssel und IV es für einen bestimmten Befehl abgeleitet hat. – glibdud

Verwandte Themen