11

暗号クラスに問題があります。時々それは非常に速いです。しかし時々それは遅いです。私が使用しているコードは次のとおりです

class Cipher {
    private $securekey, $iv;
    function __construct() {
        $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/!2s02Uh46vuT4l7sc7a@cZ27Q',TRUE);
        $this->iv = mcrypt_create_iv(32);
    }
    function encrypt($input) {
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB));
    }
    function decrypt($input) {
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB));
    }
    function storeIV() {
        return $this->iv;
    }
}

なぜこれが時々遅くなるのか、そしてどうすればこれを修正できるのかについての提案はありますか?

4

3 に答える 3

26

(システム乱数ジェネレーター)、(/ dev / randomからデータを読み取る)、(/ dev / urandomからデータを読み取る)の3mcrypt_create_iv()つの異なる2番目の引数を試しましたか?それらは異なる一貫した速度を提供しますか?/ dev / random(デフォルトのランダムソース)が収集されたエントロピーを使い果たしているためだろうか。関数はブロックするとブロックします。MCRYPT_RANDMCRYPT_DEV_RANDOMMCRYPT_DEV_URANDOM

于 2012-06-06T16:00:23.000 に答える
6

IVを作成するときは、MCRYPT_DEV_URANDOMを使用します。安全性は低くなりますが、エントロピーが低くなりすぎてもブロックされません。MCRYPT_DEV_RANDOMは、安全を確保するために十分なエントロピーが取得されるまで待機します。

// PHP < 5.6
$this->iv = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM);

しかし、PHPのより更新されたバージョンでは、デフォルトが変更されており、元のコードが機能するはずです。

// PHP >= 5.6
$this->iv = mcrypt_create_iv(32);   // MCRYPT_DEV_URANDOM implied

PHPドキュメント:mcrypt_create_iv ($ sourceパラメーターに関する注意)

このパラメーターのデフォルト値は、PHP5.6.0より前のMCRYPT_DEV_RANDOMであったことに注意してください。

そしてUbuntuマニュアルから:

/ dev/randomと/dev/ urandomのどちらを使用すべきかわからない場合は、おそらく後者を使用することをお勧めします。原則として、/ dev / urandomは、有効期間の長いGPG / SSL/SSHキーを除くすべてに使用する必要があります。

于 2013-11-02T02:47:37.550 に答える
-1
class Cipher {
    private $securekey, $iv;
    function __construct() {
        $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/!2s02Uh46vuT4l7sc7a@cZ27Q',TRUE);
        $this->iv = isset($_SESSION['sifrem'])?$_SESSION['sifrem']:mcrypt_create_iv(34);
        $_SESSION['sifrem']=$this->iv;
    }
    function encrypt($input) {
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB));
    }
    function decrypt($input) {
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB));
    }
    function storeIV() {
        return $this->iv;
    }
}
于 2012-09-23T22:19:24.110 に答える