.net Cryptography - 有没有办法告诉某些东西被解密错了?

sar*_*ake 4 .net c# encryption cryptography

查看问题标题.

在坚果壳中,我想要做的是用用户提供的种子(关键字)加密一些数据.有没有办法知道数据被解密错误,换句话说种子是错的?

使用.net 2.0,C#

谢谢!

Pie*_*kel 5

制作加密数据的哈希部分是很正常的.比如,您有一些要加密的数据.然后,您可以创建此MD5哈希,并将其添加到数据的末尾.然后,当您解密它时,您将获取加密数据末尾的哈希值并验证哈希值是否已更改.

  • 但这无助于确定解密是否成功. (2认同)
  • 当然可以.当哈希值不匹配时,解密不成功.你在这里做的是检查数据是否被篡改.因为数据是加密的(包括哈希),所以没有人可以伪造哈希.因此,当哈希匹配时,您确定数据未被篡改.有些系统,如EAS,采用了这种机制.以上描述就是这样一种机制,您可以自己实现. (2认同)

Rem*_*anu 5

取决于您的算法细节.流密码(如RC4)本身不会检测到任何篡改.由于块填充算法(PKCS#5),分组密码(AES)可以检测到一些篡改.此填充检查是导致ICryptoTransform.TransformFinalBlock`抛出解密失败的异常的原因,但此检测不具有加密安全性(在最坏的情况下,如果填充是一个字节,则不会检测到篡改的概率为1/256).这不是.Net实现的遗漏,是使用所有加密算法的基本问题.

因此,鉴于解密操作本身基本上不能检测篡改(或使用坏密钥/ IV),解决方案是在消息中添加消息的摘要.行业标准是使用HMAC消化,并有密钥导出过程中产生足够的关键材料,关键/ IV HMAC秘密(这是怎么了TLS/SSL做到这一点,这是相当多的"行业标准",见6.3 Key calculation的RFC链接).解密步骤解密消息,然后计算消息的HMAC,将其与原始摘要进行比较.如果它们匹配,则解密成功(使用正确的密钥/ IV)并且消息未被篡改.