it-swarm.com.de

MCrypt rijndael-128 zu OpenSSL aes-128-ecb Konvertierung

Da Mcrypt veraltet ist, möchte ich stattdessen OpenSSL in meinem Code verwenden, da wir bereits php 7.0.17 auf unserem Server verwenden und es keine Ahnung gibt, wann sie aktualisieren es.

Einige Drittanbieter-APIs (gehostet auf PHP 5.x verwenden wahrscheinlich mcrypt ), nimmt verschlüsselte Daten auf. Sie haben Methoden bereitgestellt, mit denen sie Zeichenfolgen verschlüsseln/entschlüsseln.

Hier sind sie

$secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c' ;

public function encrypt128($str)
    {
        $block = mcrypt_get_block_size("rijndael_128", "ecb");
        $pad   = $block - (strlen($str) % $block);
        $str .= str_repeat(chr($pad), $pad);

        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB));
    }

public function decrypt128($str)
    {
        $str = base64_decode($str);
        $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $secret, $str, MCRYPT_MODE_ECB);

        $len = strlen($str);
        $pad = ord($str[$len - 1]);

        return substr($str, 0, strlen($str) - $pad);
    }

mit diesen Methoden String small1 wenn verschlüsselt wird v7IXp5vVaFVXXlt/MN8BVw==


Wir möchten openssl_encrypt In unserer Seite verwenden, sodass beim Verschlüsseln derselben Zeichenfolge mit OpenSSL dieselben Ergebnisse wie mit Mcrypt erzielt werden müssen. Ich habe recherchiert, dass mcrypt mit rijndael-128 mode ecb sein sollte kompatibel mit OpenSSL aes-128-ecb.

In den letzten Stunden habe ich versucht, meine eigene Methode zum Verschlüsseln von Zeichenfolgen mit OpenSSL zu entwickeln, die das gleiche Ergebnis liefern. Soweit bin ich dazu gekommen

public function sslEncrypt128($str)
{
    $secret = 'a0a7e7997b6d5fcd55f4b5c32611b87c';
    return base64_encode(openssl_encrypt($str, 'aes-128-ecb', $secret, OPENSSL_RAW_DATA));
}

Es wird jedoch eine andere Zeichenfolge SxJ3+EdaeItZx3/EwGTUbw== Für dieselbe Eingabe wie oben erstellt. Ich weiß nicht, ob es das Problem oder die Polsterung der Flagge ist. Hinweise sind willkommen.

Ich habe den Code hier hinzugefügt, um ihn online zu testen https://3v4l.org/v2J2N

Danke im Voraus.

13
Jamshad Ahmad

In Ihrem speziellen Beispiel habe ich festgestellt, dass durch Ändern von aes-128-ecb bis aes-256-ecb, es erzeugt die gleiche Ausgabe wie das Vermächtnis mcrypt_encrypt.

5
Michael Butler

Folgendes hat bei mir funktioniert:

<?php

$str = 'Content';
if (strlen($str) % 16) {
    $str = str_pad($str, strlen($str) + 16 - strlen($str) % 16, "\0");
}

$key = 'KEY';
if (strlen($key) % 16) {
    $key = str_pad($key, strlen($key) + 16 - strlen($key) % 16, "\0");
}

$res1 = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
echo strToHex($res1) . ' | mcrypt_encrypt';

echo "<hr>";
echo strToHex(openssl_decrypt($res1, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';

echo "<hr>";

$res2 = openssl_encrypt($str, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING);
echo strToHex($res2) . ' | openssl_encrypt';

echo "<hr>";
echo strToHex(openssl_decrypt($res2, "aes-128-ecb", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)) . ' | openssl_decrypt';


function strToHex($string) {
    $hex = '';
    for ($i = 0; $i < strlen($string); $i++) {
        $ord     = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex     .= substr('0' . $hexCode, -2);
    }

    return strToUpper($hex);
}
3
Roland Soós

Höchstwahrscheinlich sollte der Schlüssel als Hex verwendet werden (er ist bereits im Hex-Format) und nicht als Zeichenfolge, die in Hex konvertiert werden soll.


mcrypt:

mcrypt unterstützt kein standardmäßiges PKCS # 7-Auffüllen (geb. PKCS # 5), nur nicht standardmäßiges Null-Auffüllen das Auffüllen wird jedoch explizit vor mcrypt hinzugefügt.

Die Verschlüsselung v7IXp5vVaFVXXlt/MN8BVw== ist die richtige Verschlüsselung basierend auf PKCS # 7-Padding. EZB-Modus und der Schlüssel als Zeichenfolge.

Siehe: mcrypt - AES CALCULATOR .

Beachten Sie in hex, dass die Datenauffüllung deutlich sichtbar ist:
key: 6130613765373939376236643566636435356634623563333236313162383763
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: BFB217A79BD56855575E5B7F30DF0157

In Base64:
encrypted: v7IXp5vVaFVXXlt/MN8BVw==


OpenSSL:

Beachten Sie, dass der Schlüssel 256-Bit ist, der OpenSSL-Aufruf mit "aes-128-ecb" jedoch einen 128-Bit-Schlüssel zu implizieren scheint. Die Schlüssel stimmen also nicht überein.

Siehe: OpenSSL - AES CALCULATOR

Beachten Sie in hex, dass die Datenauffüllung deutlich sichtbar ist:
key: 61306137653739393762366435666364
data: 736D616C6C310A0A0A0A0A0A0A0A0A0A
encrypted: 4B1277F8475A788B59C77FC4C064D46F

In Base64:
encrypted: SxJ3+EdaeItZx3/EwGTUbw==

2
zaph