web-dev-qa-db-ja.com

PHP7.1 mcryptの代替

Mcrypt関数は、PHP 7.1.0。

非推奨の文字列エンコード/デコード関数:

$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");

いくつかの代替案を提案できますか?

15
Tibi

代わりに openssl_encrypt を使用する必要があります。よろしく!

18
Aleksa Arsić
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は、PHP 7.1の代替​​opensslで削除できます

1

defuse または RNCryptor の使用を検討してください。これらは完全なソリューションを提供し、メンテナンスされており、正しいものです。

1
zaph

ために MCRYPT_RIJNDAEL_256 PHP7.3の完全な回答をここに投稿しました。 https://stackoverflow.com/a/53937314/243782

スニペット:

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);
1
Pentium10

上記のように、open_sslはmcryptの代替として適しています。私がopen_sslで抱えていた唯一の問題は、大きな文字列には使用できないことです。

この問題を解決するスクリプト(静的クラス)を作成しました(大きな文字列はチャンクに分割され、バックグラウンドで個別に暗号化/復号化されます)。

パブリックGistを参照してください: https://Gist.github.com/petermuller71/33616d55174d9725fc00a663d30194ba

0
Peter Muller

いくつかの反復と documentation を使用したダンスの後、私はopenssl_encryptおよびopenssl_decrypt関数に基づいて、減価償却されたMcrypt関数を次のエンコード/デコード関数に置き換えるソリューションを作成しました。

//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;
}
0
Roman