首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >认证的AES 256 CBC HMAC SHA512 -在C#中实现的正确方法是什么?

认证的AES 256 CBC HMAC SHA512 -在C#中实现的正确方法是什么?
EN

Cryptography用户
提问于 2019-09-10 00:24:50
回答 1查看 1.3K关注 0票数 1

我有一个“加密-然后-Mac”的C#实现的"AE_AES_256_CBC_HMAC_SHA_512“没有相关的数据,只有认证。在我的代码中,我按照以下步骤加密字符串:

  1. 使用RNGCryptoServiceProvider生成32字节的隐秘随机盐;
  2. 使用RNGCryptoServiceProvider生成32字节的随机盐;
  3. 使用Rfc2898DeriveBytes (PBKDF2)派生一个32字节的密码密钥,作为参数传递密码字节、先前生成的随机密码盐字节和100000次迭代次数。
  4. 使用Rfc2898DeriveBytes (PBKDF2)派生一个32字节的auth键,作为参数传递密码字节、先前生成的随机auth盐字节和100,000次迭代次数。
  5. 加密普通字符串字节使用AES与256位/32字节派生密钥,在CBC模式下,随机IV和PaddingMode.PKCS7。
  6. 将加密的数据字节、IV、加密盐和auth salt分别写入内存流。
  7. 使用先前导出的auth键从内存流数据中计算HMACSHA512哈希。
  8. 将HMACSHA512的输出截断为初始32字节,并将此标记字节追加到内存流的末尾。
  9. 将输出字节作为Base64字符串返回。

为了解密,我采用相反的方式,在解密数据之前,将已发送的标记与calc标记进行比较。我一直在想这个实现是否正确,你能给我一个方向吗?我在正确的道路上吗?

EN

回答 1

Cryptography用户

发布于 2019-09-10 14:59:35

我将使用答案字段,因为我认为问题是做一个完整的回顾,这通常是不主题。然而,由于评论太短,我会给一些提示,然后让问题结束。

但是,如果您必须使用密码,那么您就在正确的轨道上了:

32字节的盐分过多,最多只需要16字节/ 128位。

使用双PKBDF2的想法并不好,因为攻击者只需要一个密钥就可以验证密码的正确猜测。这意味着,根据密码,攻击者需要做的工作是密码的两倍。最好使用第一个PBKDF2的输出并将其拆分(例如,对两个256位键使用SHA-512 ),或者使用KBKDF (如HKDF )派生密钥。

如果不首先验证身份验证标记,则CBC模式仍然容易受到攻击。您应该确保保持正确的顺序,或者使用AEAD方案。

可以将IV设置为全为零,或者根据密码& salt计算,因为salt已经提供了所需的随机化。你甚至可以用盐本身作为IV。

通常,我们在文件的开头(而不是结尾)写入IV / salt和其他静态信息。首先,这样更容易找到/解析,而且在开始验证和/或解密之前还需要密钥。

如果所需的是文本,则编码整个输出的基64是很好的。否则,只需将密文和头文件存储为二进制文件即可。

票数 1
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/73199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档