没有IV的php mcrypt加密

时间:2015-05-15 12:42:28

标签: php performance mcrypt initialization-vector

我需要使用加密机制。我选择了mcrypt,因为它是可用的和它的例子。但是我觉得发电时间太长了。当我在给定的例子中使用IV时,我花了很多时间,当我删除它时,它会立即生成加密值。

// Code example using IV
$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($ivSize, MCRYPT_DEV_RANDOM);

$encryptedString = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, utf8_encode($origString), MCRYPT_MODE_ECB, $iv);
return base64_encode($encryptedString);

// Code example without IV    
$encryptedString = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryptionKey, utf8_encode($origString), MCRYPT_MODE_ECB);
return base64_encode($encryptedString); 

那么,如果加密时没有使用IV会有很大的安全问题吗?

1 个答案:

答案 0 :(得分:4)

DEV_RANDOM生成来自/dev/random或等效的随机整数,用于监听不可预测的数据,如鼠标移动,键盘敲击等,以生成安全数据。如果没有按键等,它只会等到有足够的数据......这就是为什么它会变慢。

DEV_URANDOM使用/dev/urandom或等价物,虽然它也可以使用上面的数据,但除此之外,它结合了伪随机数生成器,为您提供实时随机数据(这是更可预测的,但这通常并不重要。)

它们用于确定IV的构建方式。

现在进入IVs。

IV用于导出加密函数使用的随机函数的初始种子。

您使用ECB。首先要注意的是,ECB并不使用IV,所以您所写的内容并不合理;如果您使用ECB,您可以完全跳过创建IV,您将能够毫无问题地解密您的数据。但另一方面是你不应该使用ECB。 ECB会对您的数据进行编码,以便具有相同数据的每个块看起来都一样。另一方面,CBC使用来自前一个块的数据对每个块进行xors(为此,它需要IV)。为了证明这些之间的区别,请看看:

从左到右:原始图像,使用ECB模式编码的图像和使用CBC模式编码的图像。

如果你想使用CBC,你也应该为你单独加密的每一段数据重新生成IV,否则就像使用ECB一样糟糕。每次重新生成IV都可以防止基于重复的攻击。<​​/ p>

最后,如果您使用CBC,需要存储其IV,以便您以后可以解密文本。如果你不这样做,你会得到垃圾。幸运的是,大多数加密算法的设计都是为了使IV可以是公共的,因此您不必担心将IV保密。

TL; DR:使用CBC,为每个数据分别重新生成公共IV。

(另外......如果你不关心解密,你可能会对密码哈希感兴趣。)