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

Encryption 为什么AES解密方法将IVs作为参数,encryption,cryptography,aes,Encryption,Cryptography,Aes,一般来说,我对加密还是新手,我理解为什么需要IV,但IV不是嵌入在加密数据中吗?因此,任何解密实现都不应该首先从数据中提取IV,而不是需要提供它吗 我假设IV嵌入到数据中的原因是因为某些库/工具不需要提供它,例如CryptoJS for JavaScript:CryptoJS.AES.DecryptoU2FSDGVKX1/l3HWODO9GX23rvF0KHmDR6z8XTpYYpe8=,password.toStringCryptoJS.enc.Utf8 和openssl:echo U2Fsd

一般来说,我对加密还是新手,我理解为什么需要IV,但IV不是嵌入在加密数据中吗?因此,任何解密实现都不应该首先从数据中提取IV,而不是需要提供它吗

我假设IV嵌入到数据中的原因是因为某些库/工具不需要提供它,例如CryptoJS for JavaScript:CryptoJS.AES.DecryptoU2FSDGVKX1/l3HWODO9GX23rvF0KHmDR6z8XTpYYpe8=,password.toStringCryptoJS.enc.Utf8

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

还有任何真正的AES加密应用,比如TrueCrypt

似乎需要IV的图书馆:

用于PHP的mcrypt: .Net中的对称算法:
我有什么困惑吗?

没有,静脉注射也可能是衍生出来的。将IV包含在密文中的唯一原因是当密钥被重新用于加密时,以及当IV无法派生时。它很常见,但未标准化,如果存在,则需要在其前面加前缀。但那时你需要静脉注射,所以这是事实上的标准

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

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


还有很多加密实现会出错,并且不会在CBC模式中使用随机IV。PHP mcrypt_encrypt的特殊之处在于,它甚至需要一个IV for ECB模式,但由于ECB在算法中的任何地方都不使用IV,因此该模式被仔细地忽略了。

一个常见的约定是在加密数据的开头预加IV。这并不意味着这是解密方可以或将获得IV数据的唯一方式,也不意味着加密方将自动这样做。如果您只支持读取与加密数据内联的IV,那么一些用户可能会被迫分配缓冲区并复制周围的数据,以满足您坚持IV必须位于数据开头的库的要求。@Damien_the_unsiver Well。。。在评论中,这是一个很好的回答。想不想把它贴出来,这样我就可以投票了,把它从未回答的名单上删除?@Duncan-我在试图确定一个接近的原因时,发表了这篇评论。我还没有选一个,但我还是觉得它不适合,因为它更多的是关于语言/库设计。是的,我想在信息安全中发布这个,但我决定我真的是在问对象模型,这更像是一个编程问题。我不明白为什么会有一个惯例来预先设置IV,从而修改数据的实际内容,从而违反标准?如果不能重新生成它,你必须将它存储在某个地方;你会打破哪个标准?放在前面不是标准化的,但这并不意味着不放在前面是标准化的。我只是认为该标准将涵盖加密文件的实际内容。我想它应该比那更灵活。。。但对我来说,这似乎只是使一个加密库无法与另一个加密库通信,这将是首先制定标准的目的……如果您想要标准消息格式,请使用CMS、PGP或XML加密。当然,并不是每种语言/运行时都支持这些,但标准已经到位。正是没有容器格式的低级加密方案遇到了此类问题。进一步研究后,我的问题是,我不明白,由于AES速度快,我能记住的密码永远不会有足够的熵,无法用暴力解决。所以,虽然我的问题是编程问题,但我的问题是信息安全/加密问题。