请参阅问题标题。
在坚果shell中,我要做的是使用用户提供的种子(关键字)加密一些数据。有没有办法知道数据被解密错了,换句话说种子是错的?
使用.net 2.0,C#
谢谢!
答案 0 :(得分:5)
制作加密数据的哈希部分是很正常的。比如,您有一些要加密的数据。然后,您可以创建此MD5哈希,并将其添加到数据的末尾。然后,当您解密它时,您将获取加密数据末尾的哈希值,并验证哈希值是否已更改。
答案 1 :(得分:5)
取决于您的算法细节。流密码(如RC4)本身不会检测到任何篡改。由于块填充算法(PKCS#5),分组密码(AES)可能检测到一些篡改。此填充检查是导致ICryptoTransform.TransformFinalBlock`抛出解密失败的异常的原因,但此检测不是加密安全的(在最坏的情况下,如果填充是一个字节,则不会检测到篡改的概率为1/256)。这不是.Net实现的遗漏,是使用所有加密算法的基本问题。
因此,鉴于解密操作本身基本上无法检测到篡改(或使用坏密钥/ IV),解决方案是在消息中添加消息的摘要。行业标准是使用HMAC摘要,并使密钥派生过程为密钥/ IV 和 HMAC秘密生成足够的密钥材料(TLS/SSL这样做{{3}} ,这几乎是“行业标准”,请参见RFC链接的6.3 Key calculation
。解密步骤解密消息,然后计算消息的HMAC,将其与原始摘要进行比较。如果匹配,则解密成功(使用正确的密钥/ IV)和消息未被篡改。
答案 2 :(得分:1)
如果您想防止篡改邮件,请使用HMAC。
常规加密不会篡改校样邮件。从asp.net的团队错误中学习,并进行额外的验证 - 请参阅how the asp.net padding oracle vulnerability related to getting different levels of access。
如果您没有进行额外验证,则可能会泄露攻击者可能用来尝试游戏系统的信息。
答案 3 :(得分:0)
解决该问题的正式方法是在密钥周围使用key wrap(本身会加密)。这是因为您应该只信任完全私钥,而不是信任给您的密钥。如果您使用无效密钥加密数据,那么事情就会变得糟糕。
没有在.NET中执行密钥包装的内置例程(我知道),但实质上你可以通过前缀和后缀实际密钥以16的字符串(或者你的块大小是什么来实现)来实现相同的功能。 )'A'字符。当你解密密钥时,你要确保它是pre&后缀为'A',如果没有,则将其标记为错误。
如果您的正式要求较少,则另一个选择是使用密钥解密已知使用正确密钥加密的字符串。如果您解密该字符串后会得到意外结果,则将其标记为错误。
答案 4 :(得分:0)
一种蛮力方式 - 取决于您对数据的处理方式...将其推送到任何期望它的算法并查看它是否崩溃。我加密了二进制序列化数据,我以这种方式反序列化。如果数据被错误地解密并转向噪声,则二进制格式化程序会抛出异常。