3

我需要使用加密机制。我选择了 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 的情况下加密存在任何重大安全问题?

4

1 回答 1

4

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

DEV_URANDOM使用/dev/urandom或等效,虽然它也可能使用上面的数据,除此之外,它还结合了伪随机数生成器来实时为您提供随机数据(这更可预测,但这通常无关紧要。)

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


现在进入IV。

IV 用于为加密函数使用的随机函数派生初始种子。

你使用欧洲央行。首先要注意的是 ECB 不使用 IV,所以你写的没有意义;如果您使用 ECB,您可以完全跳过创建 IV,您将能够毫无问题地解密您的数据。但另一件事是你不应该使用欧洲央行。ECB 对您的数据进行编码,以便具有相同数据的每个块看起来都相同。另一方面,CBC 将每个块与前一个块的数据进行异或(为此,它需要 IV)。为了证明它们之间的区别,看这个:

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

如果要使用 CBC,还应该为单独加密的每条数据重新生成 IV,否则与使用 ECB 一样糟糕。每次重新生成 IV 可防止基于重复的攻击。

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


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

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

于 2015-05-15T13:29:19.170 回答