Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie verstümmelten PHP-AES-CBC-Entschlüsselungscode

So lösen Sie verstümmelten PHP-AES-CBC-Entschlüsselungscode

PHPz
PHPzOriginal
2023-04-11 10:30:112631Durchsuche

In PHP wird häufig der AES-CBC-Modus zur Ver- und Entschlüsselung verwendet. Wenn Sie jedoch den AES-CBC-Modus zum Entschlüsseln verwenden, kann es zu verstümmelten Zeichen kommen. Dieses Problem kommt sehr häufig vor, ist aber leicht zu lösen. In diesem Artikel werde ich vorstellen, wie man AES-CBC-verschlüsselte Daten normalerweise über PHP entschlüsselt und verstümmelte Zeichen vermeidet.

1. Problembeschreibung

In PHP können wir die Funktionen „openssl_encrypt“ und „openssl_decrypt“ verwenden, um Verschlüsselungs- bzw. Entschlüsselungsvorgänge durchzuführen. Der folgende Code verwendet beispielsweise den AES-CBC-Modus zum Verschlüsseln von Daten:

$key = '1234567890123456';
$data = 'hello world';
$iv = '1234567890123456';

$encrypted = openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);

wobei $key der Schlüssel, $data die zu verschlüsselnden Daten und $iv der Anfangsvektor ist. Nach der Verschlüsselung erhält die Variable $encrypted die verschlüsselten Daten. Jetzt müssen wir es entschlüsseln:

$key = '1234567890123456';
$encrypted = 'soLPpFUpwJdVEaYpuu6zRg==';
$iv = '1234567890123456';

$decrypted = openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
echo $decrypted;

Nachdem Sie den obigen Code ausgeführt haben, erhalten Sie jedoch möglicherweise die folgende Ausgabe:

纭洏鍥?J    鍗虫槑涓?

Dies ist ein Kauderwelsch, nicht die Originaldaten „Hallo Welt“. Dies liegt daran, dass die Entschlüsselungsfunktion strenge Beschränkungen hinsichtlich der Länge der Eingabeparameter hat. Wenn also die Länge der zu entschlüsselnden Daten falsch ist, treten verstümmelte Zeichen auf.

2. Lösung

Um dieses Problem zu lösen, müssen wir einige Grundkenntnisse des AES-CBC-Modus verstehen.

Im AES-CBC-Modus erfordern sowohl die Verschlüsselung als auch die Entschlüsselung einen Initialisierungsvektor (IV). Dieser anfängliche Vektor muss während der Verschlüsselung und Entschlüsselung denselben Wert verwenden, da er sonst bei der Entschlüsselung zu Datenfehlern führt.

Die Länge des Anfangsvektors muss der vom Verschlüsselungsalgorithmus geforderten Blockgröße entsprechen. Wenn Sie beispielsweise den 128-Bit-AES-CBC-Modus verwenden, muss der Initialisierungsvektor 16 Byte lang sein (128 Bit / 8 Bit). Wenn diese Anforderung nicht erfüllt ist, kommt es bei der Entschlüsselung zu verstümmelten Zeichen oder anderen Problemen.

Daher müssen wir prüfen, ob die Länge des Eingabeparameters den Anforderungen entspricht. Wenn die Länge unzulässig ist, ist ein Auffüllvorgang erforderlich. Vor der Entschlüsselung kann ein Auffüllen erfolgen, um sicherzustellen, dass die Länge der Eingabedaten mit der Länge der Verschlüsselung übereinstimmt.

Angesichts der oben genannten Probleme und Lösungen können wir den Originalcode ändern, um ihn an die Anforderungen des AES-CBC-Modus anzupassen, wie unten gezeigt:

$key = '1234567890123456';
$encrypted = 'soLPpFUpwJdVEaYpuu6zRg==';
$iv = '1234567890123456';

// 检查初始向量长度是否正确
if (strlen($iv) != 16) {
    echo 'Error: IV length is not valid!';
    exit;
}

// 检查输入参数长度是否正确
$decrypted = openssl_decrypt($encrypted, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
if ($decrypted === false) {
    // 进行填充操作
    $padded_data = $encrypted . str_repeat(chr(16), 16 - (strlen($encrypted) % 16));
    $decrypted = openssl_decrypt($padded_data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
}

echo $decrypted;

Überprüfen Sie im obigen Code zunächst, ob die anfängliche Vektorlänge korrekt ist. Ist sie falsch, wird ein Fehler ausgegeben und das Programm beendet. Als nächstes wird die Länge der Eingabedaten vor der Entschlüsselung überprüft. Wenn die Länge falsch ist, wird eine Auffüllung durchgeführt, um sicherzustellen, dass die Datenlänge den Anforderungen entspricht.

Auf diese Weise können Sie beim Entschlüsseln verstümmelte Zeichen vermeiden.

3. Zusammenfassung

Wenn der AES-CBC-Modus für die Ver- und Entschlüsselung verwendet wird und die Länge des Eingabeparameters falsch ist, kann die Entschlüsselung fehlschlagen und verstümmelte Zeichen erscheinen. Um dieses Problem zu vermeiden, müssen wir die Länge der Eingabeparameter überprüfen und die erforderlichen Auffülloperationen durchführen.

Das Obige ist meine Lösung für das Problem der Entschlüsselung verstümmelter Zeichen im PHP AES CBC-Modus. Hoffe es hilft.

Das obige ist der detaillierte Inhalt vonSo lösen Sie verstümmelten PHP-AES-CBC-Entschlüsselungscode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn