是否可以在ECB模式下使用带有IV的AES?

时间:2009-11-24 12:16:08

标签: php encryption cryptography

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会提供更多的安全性吗?

4 个答案:

答案 0 :(得分:17)

在ECB模式下无法使用IV。然而,这有点没有实际意义,因为你应该

从未使用ECB模式进行任何事情,永远*。

更一般地说,您可能不应该直接使用加密原语,而是使用像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加密。