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

您是否尝试过三个不同的第二个参数mcrypt_create_iv():(MCRYPT_RAND系统随机数生成器)、MCRYPT_DEV_RANDOM(从 /dev/randomMCRYPT_DEV_URANDOM读取数据)和(从 /dev/urandom 读取数据)?它们是否提供不同的一致速度?我想知道是不是因为 /dev/random (默认随机源)用完了收集的熵;该功能将在执行时阻塞。

于 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 参数)

请注意,此参数的默认值是 PHP 5.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 回答