从http://php.net/manual/en/function.mcrypt-encrypt.php开始,我在ECB模式下使用AES和IV看到了以下代码,
<?php
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "This is a very secret key";
$text = "Meet me at 11 o'clock behind the monument.";
echo strlen($text) . "\n";
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv);
echo strlen($crypttext) . "\n";
?>
但是从维基http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation来看,它表示欧洲央行不需要IV。 是否真的可以在ECB模式下使用带有IV的AES?在这种ECB模式下,与不使用时相比,额外的IV会提供更多的安全性吗?
答案 0 :(得分:17)
在ECB模式下无法使用IV。然而,这有点没有实际意义,因为你应该
更一般地说,您可能不应该直接使用加密原语,而是使用像keyczar这样的加密库来抽象出这些类型的决策。
**实际上,ECB有一些非常专业的用途,例如“安全”伪随机排列 - 但你肯定不应该使用ECB来处理与加密数据有关的任何事情。
答案 1 :(得分:10)
ECB不会在块之间执行链接,因此无法使用IV。 mcrypt对所有模块使用相同的APi。对于ECB,IV被忽略,因为ECB模块具有以下定义为
的功能int _has_iv() { return 0; }
答案 2 :(得分:6)
首先,你没有任何地方可以把这个IV。 ECB通过逐个获取明文块并使用密钥加密它们来生成相应的密文。没有地方可以使用IV。这就是理论所说的。
我不知道mcrypt_encrypt如何工作的细节,但我怀疑在使用ECB时它只是不使用IV。通过在提供不同IV的ECB中加密来尝试。如果结果相同,则该函数不使用IV。
答案 3 :(得分:0)
ECB完全可以接受计数器(CTR)模式加密/解密: http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29
请注意,CTR解密 CTR加密。