Hilfe bei der Übersetzung von Python zu PHP

Hallo,

kann jemand etwas Python oder kennt sich mit Verschlüsslungs-Funktionen aus?

ich habe eine Python-Funktion, die ich in PHP übersetzen muss.


def decrypt_password(encrypted_password):
    """Decrypt password.
    :param encrypted_password: Encrypted password
    """
    key = b'\x01\x02\x03\x04\x05\x06\x07\x08	
\x0b\x0c\r\x0e\x0f\x10' \
          b'\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f '
    init_vector = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
                  b'\x00\x00\x00\x00'
    cipher = AES.new(key, AES.MODE_CBC, init_vector)
    json_password = json.loads(unpad(
        cipher.decrypt(base64.b64decode(encrypted_password)).decode('utf-8')))
    return json_password["apPasswordHash"]

den Anfang habe ich (vermutlich) schon korrekt umgesetzt


function decryptPwd($encrypted_password)
{
    $pw = base64_decode($encrypted_password);

    $key = pack(
            'c*',
            0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
            0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11,
            0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
            0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
        );
    echo 'key=' . print_r(unpack('c*', $key), true) . PHP_EOL;

    $init_vector = pack(
            'c*',
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
        );
    echo 'init_vector=' . print_r(unpack('c*', $init_vector), true) . PHP_EOL;

    /*
    cipher = AES.new(key, AES.MODE_CBC, init_vector)
    json_password = json.loads(
            unpad(
                cipher.decrypt(
                        pw
                ).decode('utf-8')
            )
        )
    return json_password["apPasswordHash"]
    */
}


Ich habe zwar PHP: mcrypt_decrypt - Manual gefunden, aber so richtig schlau werde ich da auch nicht draus.

Über eine Schubs in die richtige Richtung würde ich mich freuen.

Leider tue ich mich mit der Python-Syntax schwer, sodaß ich noch nicht sehe, wie ich das Ergebnis von der neuen Funktion mit dem Original vergleichen kann.

Danke
demel

Das ist veraltet und kannst Du nicht mehr verwenden, aktuell ist die Benutztung von Sodium zum Ver- und Entschlüsseln. Ich nutzte das bei Doorbird mit ChaCha20 und Poly1305. in Deinem Fall scheint ja AES verwendet zu werden. Das in PHP umzuschreiben müste ich auch erst mal in der Doku suchen. Hier gibt es noch Informationen zu Sodium.

Kai und auch ich haben es schon öfter mit openssl genutzt.
Schau Mal hier:
IP-Symcon Community Forum
Michael

Hallo Michael,

danke, das hat (nach einer Menge Tüftelei) zum Ziel geführt.

Falls jemand mal wieder so etwas braucht - diese PHP-Funktion liefert das gleiche Ergebnis wie das Python-Original


function decryptPassword($encrypted_password)
{
    $pwHash = false;

    $key = pack(
            'c*',
            0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
            0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
            0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
            0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
        );
    $iv = pack(
            'c*',
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
        );

    $pw = base64_decode($encrypted_password);
    $data = openssl_decrypt($pw, 'AES-256-CBC', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
    if ($data != false) {
        $data = utf8_decode($data);

        // unpad
        $pad = ord(substr($data, strlen($data) - 1, 1));
        $data = substr($data, 0, -$pad);

        $jdata = json_decode($data, true, 512, JSON_UNESCAPED_SLASHES);
        if (isset($jdata['apPasswordHash'])) {
            $pwHash = $jdata['apPasswordHash'];
        }
    }
    return $pwHash;
}