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

bob*_*obo 4 php encryption cryptography

http://php.net/manual/en/function.mcrypt-encrypt.php,我看到以下代码使用AES和ECB模式下的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";
?>
Run Code Online (Sandbox Code Playgroud)

但是从维基http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation,它说欧洲央行不需要IV.是否真的可以在ECB模式下使用带有IV的AES?在这种ECB模式下,与不使用时相比,额外的IV是否会提供更多的安全性?

Nic*_*son 17

在ECB模式下无法使用IV.然而,这应该是有点没有意义的

永远不会使用ECB模式的任何东西,永远*.

更一般地说,您可能不应该直接使用加密原语,而是使用像keyczar这样的加密库来抽象出这些类型的决策.

**实际上,ECB有一些非常专业的用途,例如"安全"伪随机排列 - 但你肯定不应该将ECB用于与加密数据相关的任何事情.


ZZ *_*der 10

ECB不会在块之间执行链接,因此无法使用IV.mcrypt对所有模块使用相同的APi.对于ECB,IV被忽略,因为ECB模块具有以下定义的功能,

int _has_iv() { return 0; }
Run Code Online (Sandbox Code Playgroud)


Kry*_*ian 6

首先,你没有任何地方可以把这个IV.ECB通过逐个获取明文块并使用密钥加密它们来生成相应的密文.没有地方可以使用IV.这就是理论所说的.

我不知道mcrypt_encrypt如何工作的细节,但我怀疑在使用ECB时它只是不使用IV.通过在提供不同IV的ECB中加密来尝试.如果结果相同,则该函数不使用IV.