如何安全地为AES CBC加密生成IV?

nem*_*ems 11 php openssl cryptography vector

我正在研究一些加密的东西.

  • 我使用AES 256和CBC模式
  • 我用OPENSSL

我知道以下事情(来源=维基百科):

初始化矢量应该是:

  • 唯一:对于使用给定密钥加密的任何消息,不得重复
  • 不可预测:观察任意数量的消息及其IV的攻击者应该没有信息来预测下一个消息,其成功概率大于每比特50%(即无法区分随机)

我的问题是,如何使用OPENSSL和PHP安全地生成IV?我知道lib mcrypt中存在这样的功能(http://fr2.php.net/manual/fr/function.mcrypt-create-iv.php)

我没有找到任何与OPENSSL这样做的东西(产生独特且不可预测的IV).

Tho*_*nin 9

使用openssl_random_pseudo_bytes(最好将第二个参数设置为现有变量,然后应测试它是否设置为TRUE).这将生成具有适当随机性特征的IV.

$wasItSecure = false;
$iv = openssl_random_pseudo_bytes(16, $wasItSecure);
if ($wasItSecure) {
    // We're good to go!
} else {
    // Insecure result. Fail closed, do not proceed.
}
Run Code Online (Sandbox Code Playgroud)

或者,PHP 7提供random_bytes()了更简单的功能.

  • 请注意,openssl_random_pseudo_bytes的第二个可选参数是对变量的引用.当生成的字符串被视为"加密强"时,其值由openssl设置.见http://www.openssl.org/docs/crypto/RAND_bytes.html (2认同)