我有一个“加密-然后-Mac”的C#实现的"AE_AES_256_CBC_HMAC_SHA_512“没有相关的数据,只有认证。在我的代码中,我按照以下步骤加密字符串:
为了解密,我采用相反的方式,在解密数据之前,将已发送的标记与calc标记进行比较。我一直在想这个实现是否正确,你能给我一个方向吗?我在正确的道路上吗?
发布于 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是很好的。否则,只需将密文和头文件存储为二进制文件即可。
https://crypto.stackexchange.com/questions/73199
复制相似问题