Module und Algorithmen
Mcrypt verwendet hauptsächlich das Mcrypt-Tool, um Verschlüsselungsvorgänge durchzuführen. Daher müssen wir in CentOS oder anderen Betriebssystemen libmcrypt-devel installieren, um diese Erweiterung verwenden zu können. Wenn es nicht in yum installiert werden kann, aktualisieren Sie einfach die Yum-Quelle direkt.
Mcrypt enthält viele Module und Algorithmen. Der Algorithmus muss nicht erklärt werden, es handelt sich um die Methode zur Verschlüsselung von Daten. Bei den Modulen, darunter CBC, OFB, CFB und ECB, handelt es sich um eine Reihe von Gruppierungs- und Stream-Verschlüsselungsmodi. Für spezifische Unterscheidungen können Sie hier zunächst einen Blick darauf werfen an den Modulen und Algorithmen, die in unserer Umgebung unterstützt werden. Die Funktion
$algorithms = @mcrypt_list_algorithms(); print_r($algorithms); // Array // ( // [0] => cast-128 // [1] => gost // [2] => rijndael-128 // [3] => twofish // [4] => arcfour // [5] => cast-256 // [6] => loki97 // [7] => rijndael-192 // [8] => saferplus // [9] => wake // [10] => blowfish-compat // [11] => des // [12] => rijndael-256 // [13] => serpent // [14] => xtea // [15] => blowfish // [16] => enigma // [17] => rc2 // [18] => tripledes // ) $modes = @mcrypt_list_modes(); print_r($modes); // Array // ( // [0] => cbc // [1] => cfb // [2] => ctr // [3] => ecb // [4] => ncfb // [5] => nofb // [6] => ofb // [7] => stream // )
mcrypt_list_algorithms() kann alle unterstützten Mcrypt-Algorithmen in der aktuellen Umgebung abrufen. Und mcrypt_list_modes() druckt alle unterstützten Module in der aktuellen Umgebung aus. Beachten Sie, dass diese Inhalte in einigen PHP-Versionen oder in einigen Systemen unterschiedlich sind. Bei der Verwendung von Mcrypt-bezogenen Verschlüsselungsfunktionen werden diese beiden Elemente zusammen verwendet. Daher ist es für uns notwendig, die in der aktuellen Umgebung unterstützten Module und Algorithmen in der Umgebung, in der Mcrypt ausgeführt werden muss, vorab zu bestimmen.
Daten verschlüsseln und entschlüsseln
$key = hash('sha256', 'secret key', true); $input = json_encode(['id'=>1, 'data'=>'Test mcrypt!']); $td = @mcrypt_module_open('rijndael-128', '', 'cbc', ''); $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM); @mcrypt_generic_init($td, $key, $iv); $encrypted_data = @mcrypt_generic($td, $input); @mcrypt_generic_deinit($td); @mcrypt_module_close($td); echo $encrypted_data, PHP_EOL; // ��I $�3���gE�ǣu(�9n����� // p�>P $td = @mcrypt_module_open('rijndael-128', '', 'cbc', ''); @mcrypt_generic_init($td, $key, $iv); $data = @mdecrypt_generic($td, $encrypted_data); echo $data, PHP_EOL; // {"id":1,"data":"Test mcrypt!"} @mcrypt_generic_deinit($td); @mcrypt_module_close($td);
Der Code ist ziemlich komplex und chaotisch, schauen wir uns ihn Stück für Stück an.
Zuerst bestimmen wir einen verschlüsselten Schlüssel und dann sind die Eingabe die Daten, die wir verschlüsseln möchten. Beispielsweise möchten wir JSON-Daten verschlüsseln. Dieser Schlüssel kann tatsächlich eine Zeichenfolge sein, aber wir führen hier auch eine Hash-Verarbeitung für den Schlüssel durch. Den Hash-bezogenen Inhalt haben wir bereits im vorherigen Artikel ausführlich erläutert.
Der nächste Schritt besteht darin, mcrypt_module_open() zu verwenden, um ein Verschlüsselungsmodul-Handle zu öffnen. Hier verwenden wir den Rijndael-128-Algorithmus und das cbc-Modul. Verwenden Sie dann mcrypt_create_iv(), um ein iv zu erstellen. Dieses iv ist ein Initialisierungsvektor. Der Wert des Initialisierungsvektors variiert je nach kryptografischem Algorithmus. Die grundlegendste Anforderung ist „Einzigartigkeit“, was bedeutet, dass derselbe Schlüssel nicht denselben Initialisierungsvektor wiederverwendet. Diese Funktion ist sowohl bei der Blockverschlüsselung als auch bei der Stromverschlüsselung sehr wichtig. Ich glaube, wenn Sie Schnittstellenkommunikation im Zusammenhang mit WeChat oder Alipay durchgeführt haben, werden Sie dieses iv-Attribut beim Entschlüsseln von Verifizierungsdaten definitiv gesehen haben.
Verwenden Sie mcrypt_generic(), um das Verschlüsselungsergebnis zu generieren, verwenden Sie mcrypt_generic_deinit(), um die Generierungsinitialisierung zu beenden, und schließen Sie schließlich das Verschlüsselungsmodul-Handle über mcrypt_module_close(). Auf diese Weise wird eine Reihe von Mcrypt-Verschlüsselungsprozessen abgeschlossen.
In ähnlicher Weise sind der Entschlüsselungsprozess und der Verschlüsselungsprozess ähnlich, außer dass wir zum Entschlüsseln die Funktion mdecrypt_generic() verwenden.
Eine andere Möglichkeit, Daten zu verschlüsseln und zu entschlüsseln
Der oben beschriebene Verschlüsselungsprozess ist sehr mühsam und kompliziert. Tatsächlich bietet Mcrypt auch eine einfachere Verschlüsselungsfunktion.
$string = 'Test MCrypt2'; $algorithm = 'rijndael-128'; $key = md5( "mypassword", true); $iv_length = @mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC ); $iv = @mcrypt_create_iv( $iv_length, MCRYPT_RAND ); $encrypted = @mcrypt_encrypt( $algorithm, $key, $string, MCRYPT_MODE_CBC, $iv ); $result = @mcrypt_decrypt( $algorithm, $key, $encrypted, MCRYPT_MODE_CBC, $iv ); echo $encrypted, PHP_EOL; // \<�`�U��Uf)�Y echo $result, PHP_EOL; // Test MCrypt2
Wir müssen noch die zu verschlüsselnden Daten, den Algorithmus, den Schlüssel und den IV-Vektor vorbereiten. Dann verwenden Sie einfach mcrypt_encrypt() und mcrypt_decrypt() direkt, um die Verschlüsselung/Entschlüsselung durchzuführen. Ist das nicht viel bequemer?
Zusammenfassung
Im Vergleich zu Hash ist Mcrypt eine entschlüsselbare symmetrische Verschlüsselungsform. Was symmetrische und asymmetrische Verschlüsselung ist, werden wir in der Untersuchung der OpenSSL-Erweiterung ausführlich erläutern. Die Hash-Verschlüsselung ist eine Einwegverschlüsselungsform und die Originaldaten können nicht durch umgekehrte Berechnung der verschlüsselten Daten erhalten werden. Sie haben alle unterschiedliche Anwendungsszenarien, aber wie PHP fordert, ist Mcrypt keine empfohlene Erweiterung mehr, daher haben wir hier einfach Verschlüsselungs-/Entschlüsselungstests durchgeführt. Wenn Sie nützlich sind, können Sie mit dem Handbuch ausführlicher erfahren.
Testcode:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84Mcrypt%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E7%9F%A5%E8%AF%86%E4%BA%86%E8%A7%A3.php