Ich habe eine Python-Anwendung und PHP-Website, die über eine bestimmte Netzwerkschicht kommunizieren, die Nachrichten sendet. Meine Aufgabe ist es, alle Nachrichten AES-verschlüsselt und Base64-codiert mit diesem Kanal zu senden. Der Verschlüsselungsschlüssel wird für beide Parteien manuell freigegeben.Eine Python-zu-PHP-kompatible AES-Verschlüsselung mit openssl_encrypt AES-CBC
In meinem PHP, habe ich diesen Code letzte Nachrichtentext $payload
genannt zu erstellen:
$key = substr('abdsbfuibewuiuizasbfeuiwhfashgfhj56urfgh56rt7856rh', 0, 32);
$magic = 'THISISANENCRYPTEDMESSAGE';
function crypted($data) {
global $key, $magic;
// serialize
$payload = json_encode($data);
// encrypt and get base64 string with padding (==):
$payload = @openssl_encrypt($payload, 'AES-192-CBC', $key);
// prepend with magic
$payload = $magic.$payload;
return $payload;
}
Und ich erhält eine solche Nachricht in meinem Python-Anwendung, die Magie Strippen, Base64-Byte-Daten zu bekommen. Das Problem, dass ich keine Probe finden kann, um kompatible AES-Chiffre zu machen, um diese Nachricht zu entschlüsseln.
Schlüssel und "Magic" sind nur Werte, die auf beiden Seiten geteilt und bekannt sind, ist das korrekt? Brauche ich eine IV?
Hier ist Python-Lösung von SO, die nicht für meine verschlüsselten Nachrichten funktioniert.
Es scheitert auf der letzten Zeile mit Dekodierungsproblem. Der Decodiermodus "Ignorieren" gibt eine leere Zeichenfolge zurück.
# with magic: "THISISANENCRYPTEDMESSAGE8wZVLZpm7UNyUf26Kds9Gwl2TBsPRo3zYDFQ59405wI="
# contains: {'test': 'hello world'}
payload = '8wZVLZpm7UNyUf26Kds9Gwl2TBsPRo3zYDFQ59405wI='
aes = AESCipher('abdsbfuibewuiuizasbfeuiwhfashgfh')
print(aes.decrypt(payload))
Löst:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "../test.py", line 36, in decrypt
return self.__unpad(cipher.decrypt(enc).decode("utf-8"))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9e in position 0: invalid start byte
Was bin ich?
Warum verwenden Sie 'text [-1]' (ein 'x02' Byte, so dass Sie die letzten 2 Bytes ignorieren) um festzustellen, wie lang die verschlüsselte Datenfolge ist? –
Verwenden Sie den Schlüssel als IV ist eine wirklich nicht intelligente Idee. Wie wirklich nicht schlau. Und ein Schlüssel, der vollständig aus ASCII-Buchstaben und Zahlen besteht, reduziert den möglichen Schlüsselraum signifikant. –