为什么AES解密方法将IV作为参数

时间:2014-04-22 13:38:09

标签: encryption cryptography aes

我一般都不熟悉加密,我理解为什么IV是必要的,但是加密数据中嵌入的IV是不是?因此,任何解密实现都不应该首先从数据中提取IV而不是需要提供它吗?

我认为IV嵌入数据的原因是因为某些库/工具不需要提供它,例如CryptoJS for JavaScript:CryptoJS.AES.decrypt("U2FsdGVkX1/l3HWODO9GX23rvF0KHmDR6z8XTpYYpe8=", "password").toString(CryptoJS.enc.Utf8));

和openssl:echo "U2FsdGVkX1++pGg+oWqZbIjccV1NiV2pc1QrQtw0wp4=" | openssl aes-256-cbc -d -a -pass pass:password

以及任何进行AES加密的实际应用,例如TrueCrypt。

似乎需要IV的图书馆:

我有什么困惑吗?

1 个答案:

答案 0 :(得分:0)

不,也可以推导出IV。将IV与密文一起包含的唯一原因是当无法导出IV时,密钥被重用于加密。它很常见,但没有标准化,或者如果它存在则需要加上前缀。但那就是你需要IV的时候,所以这是事实上的标准。

在OpenSSL示例中,使用随机盐从密码生成密钥。在这种情况下,每个加密的盐都不同,因此密钥也是随机的。在这种情况下,不需要随机IV,尽管它也可以(也将用于OpenSSL)从盐和密码派生。

其他协议包含计数器,在这种情况下,计数器上的单个块加密可用于创建用于CBC模式加密的IV。只要计数器在发送器/接收器处保持不变,就不需要发送IV。

并且有大量的加密实现会导致错误,并且不会将随机IV用于CBC模式。 PHP mcrypt_encrypt在某种意义上是特殊的,因为它甚至需要IV用于ECB模式,然后由于ECB在算法中的任何地方都不使用IV而被忽略。