1

我正在学习加密并在 PHP 中使用 openssl_encrypt。我分别使用 2 个函数进行加密和解密。我只是传递要加密/解密的数据,以及属于用户的唯一 ID。该函数返回加密/解密的数据。

调用该函数时,我收到一条 PHP 警告,提示“openssl_encrypt():使用空的初始化向量 (iv) 可能不安全且不推荐”。

我已经阅读了一些关于 IV 的内容,并试图了解在这种情况下是否需要 IV,如果我为每个加密数据集使用唯一密钥:

我的加密功能是这样设置的:

function EncryptData($inputString,$uniqueID)
{

global $encryptKey;  // Pulls out encryption key stored in a separate file
$method = 'aes256';  //Encryption Method

return openssl_encrypt($inputString,$method,$encryptKey.$uniqueID);

}

解密函数几乎相同,只是它改为解密并返回数据。

请注意,我将全局加密密钥与用户的唯一 ID 组合在一起以生成组合密钥。这确保了每个用户的密钥都是唯一的。因此,这也应该确保加密数据对于不同的用户也是唯一的,即使未加密的值是相同的,对吗?如果是这样,那么在这种情况下是否需要静脉注射?仍然使用 IV 是否有优势或不使用 IV 的劣势?

4

3 回答 3

1

如果对每个加密数据集使用不同的密钥,是否需要初始化向量?

这取决于模式。对于欧洲央行模式,没有。事实上,ECB 模式不需要 IV。但是,一旦您加密大于块大小的数据,您就会失去语义安全性。也就是说,任何超过密码块大小的东西都会泄漏信息。请参阅Block Cipher Modes of Operation中的 Tux 图片。

其他模式,例如 CBC、OFC、FBC、CTR 和其他模式需要 IV。不过,IV 要求因模式而异。有些允许唯一的 IV,有些则需要随机 IV,有些则禁止在密钥中重复使用 IV。

至于您的警告:只需在每次加密时使用随机 IV,您将避免大多数陷阱。如果您重新加密解密的消息,则使用新的 IV。

仍然使用 IV 是否有优势或不使用 IV 的劣势?

如果消息相同,则在同一用户下加密的两条消息将产生相同的密文。你泄露了信息,失去了语义安全。

于 2014-01-24T03:50:27.330 回答
0

这个问题可能对有所帮助。它为加密提供语义安全,重复使用相同的密钥不会向攻击者泄露信息。

于 2014-01-24T03:51:21.970 回答
0

如果您使用相同的密钥加密多条消息(例如,在您的情况下,同一用户的两条加密消息),您应该每次使用不同的IV 。

原因是两条以相同数据开头的消息(在每个加密块内,对于AES为 16 个字节),在使用相同的IV时,在加密形式下看起来也相同。

以相同序列开头的两条加密消息揭示了有关加密数据的信息。

于 2014-01-24T07:27:13.470 回答