Die Mcrypt-Funktion wurde ab PHP 7.1.0 nicht mehr unterstützt.
Meine veralteten Zeichenkodierungs-/Dekodierungsfunktionen:
$key: secret key
$str: string
$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $str, MCRYPT_MODE_CBC, md5(md5($key))));
$decoded = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($str), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
Können Sie Alternativen vorschlagen?
Verwenden Sie stattdessen openssl_encrypt . Grüße!
echo encrypt_openssl($str, $key);
function encrypt_openssl($msg, $key, $iv = null) {
$iv_size = openssl_cipher_iv_length('AES-256-CBC');
if (!$iv) {
$iv = openssl_random_pseudo_bytes($iv_size);
}
$encryptedMessage = openssl_encrypt($msg, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($iv . $encryptedMessage);
}
mcrypt kann in PHP 7.1 alternative openssl entfernt werden
Wie oben erwähnt, ist open_ssl eine gute Alternative für mcrypt. Das einzige Problem, das ich mit open_ssl hatte, ist, dass es nicht für große Zeichenfolgen verwendet werden kann.
Ich habe ein Skript (statische Klasse) geschrieben, das dieses Problem überwindet (große Zeichenfolgen werden in Blöcke aufgeteilt und im Hintergrund separat verschlüsselt/entschlüsselt).
Siehe public Gist: https://Gist.github.com/petermuller71/33616d55174d9725fc00a663d30194ba
Nach einigen Iterationen und dem Tanzen mit der Dokumentation habe ich die Lösung geschaffen, um die abgelehnte Mcrypt-Funktion durch die folgenden encode/decode-Funktionen auf der Grundlage der Funktionen openssl_encrypt und openssl_decrypt zu ersetzen:
//Return encrypted string
public function stringEncrypt ($plainText, $cryptKey = '7R7zX2Urc7qvjhkr') {
$length = 8;
$cstrong = true;
$cipher = 'aes-128-cbc';
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext_raw = openssl_encrypt(
$plainText, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $ciphertext_raw, $cryptKey, $as_binary=true);
$encodedText = base64_encode( $iv.$hmac.$ciphertext_raw );
}
return $encodedText;
}
//Return decrypted string
public function stringDecrypt ($encodedText, $cryptKey = '7R7zX2Urc7qvjhkr') {
$c = base64_decode($encodedText);
$cipher = 'aes-128-cbc';
if (in_array($cipher, openssl_get_cipher_methods()))
{
$ivlen = openssl_cipher_iv_length($cipher);
$iv = substr($c, 0, $ivlen);
$hmac = substr($c, $ivlen, $sha2len=32);
$ivlenSha2len = $ivlen+$sha2len;
$ciphertext_raw = substr($c, $ivlen+$sha2len);
$plainText = openssl_decrypt(
$ciphertext_raw, $cipher, $cryptKey, $options=OPENSSL_RAW_DATA, $iv);
}
return $plainText;
}
Für MCRYPT_RIJNDAEL_256
habe ich eine vollständige Antwort für PHP7.3 hier veröffentlicht: https://stackoverflow.com/a/53937314/243782
schnipsel:
funktioniert so mit der Bibliothek phpseclib
$rijndael = new \phpseclib\Crypt\Rijndael(\phpseclib\Crypt\Rijndael::MODE_ECB);
$rijndael->setKey(ENCRYPT_KEY);
$rijndael->setKeyLength(256);
$rijndael->disablePadding();
$rijndael->setBlockLength(256);
$decoded = $rijndael->decrypt($term);