为了HMAC的目的,允许使用AES 256对任何数据进行解密

本文关键字:任何 数据 解密 AES HMAC 许使用 为了 | 更新日期: 2023-09-27 18:27:45

考虑一个将由我要写入的C#库加密的文件,该文件由一个64字节的HMAC组成,后面紧跟着用AES 256加密的加密数据。16字节IV、32字节Key和64字节HMACSHA512初始化密钥将来自Rfc2898DeriveBytes,通过用户输入的单个字符串密码(4096次迭代,以及来自random.org的单个salt)

  1. 这种设计是否有任何负面的安全影响?

  2. 我落水了吗?(它,具有64字节初始化密钥或4096次迭代)

  3. 我希望能够解密任何数据,以便使用嵌入式HMAC验证密码是否正确(即,"解密的文件是原始文件")。具体来说,我希望避免出现诸如"填充无效且无法删除"之类的错误。对此有什么想法吗?

为了HMAC的目的,允许使用AES 256对任何数据进行解密

  1. 是的,IV应该在密文之前加上前缀,并且应该是随机的。如果你使用Rfc2898DeriveBytes,你每次都会得到相同的IV,所以加密不同的明文会导致相同的密文,从而泄露信息。

  2. 是的,64字节的初始化密钥有点多。16到32个字节应该足够了。也就是说,它在性能方面没有太大区别,所以…4Ki迭代很好(为什么不只是4000次,算法不会改变)。

  3. 是的,将HMAC放置在加密数据上,并确保在解密(最后一个块)之前验证HMAC。通常,HMAC被放置在密文之后(因为流式实现只有在加密了所有密文之后才知道HMAC)。

或者,你可以在GCM模式下使用AES,这样你就不再需要HMAC了。GCM(或EAX)模式并不总是可用的。