2017-05-08 92 views
0

我正在寻找一种可靠的方法来验证解密加密的有效负载后返回的字符串是否为垃圾值(如: =z { Z : k/ ˃ d A * Ԥ = M 5)。 我试图用不同的公钥解密加密的字符串,所以,如预期的那样,我得到了上面发布的垃圾字符串。我的问题是,在c#中验证返回的字符串是一个有效的字符串还是垃圾值的最佳方法是什么?如何验证Bouncy Castle rsa解密返回的垃圾数值错误密钥

回答

0

你建议,如果返回的字符串是ASCII(ASCII技术上的一个子集)......考虑到你的名字和姓氏将只检查该解决方案,你应该有第一手的知识,世界不是由ASCII字符串组成的。 Unicode是“发明”的原因。现在,正如here所写,RSA是“可延展的”。一个非常简单的解决方案是在加密所有内容之前将原始文本的散列(例如使用SHA256)附加/前缀到文本中,然后在解密后验证散列是否正确。

+0

我同意这将是一个更干净的方式,但由于在我的情况下,它将需要客户端的变化(因为他们正在加密字符串,我在服务器端代码解密),我将不得不与我的解。另外,如果我只考虑ASCII的那个“子集”,因为我期望我的字符串只有那些字符,所以我认为这样可以。 – tavier

+0

顺便说一句,只是好奇,我的名字和姓氏有什么问题。在英语中,它落在ASCII字符的子集内吗? :) – tavier

+0

@AshishAgrawal大概有一半的美国程序员认为所有的字母都包含在AZ字符集中......他们甚至无法想象其他语言可能需要非ASCII字符,比如àèéìòù(甚至不考虑中文,日语,各种印度语......)......你可以在每个正则表达式问题中看到这个(“我怎么检查它是否是一个单词?使用类似'[A-Za-z] *'的东西'。给定你的名字,你应该是(或者你的父母应该是)来自世界上其中AZ不是你的本地字符集的地方 – xanatos

0

如果您只关注RSA,请使用适当的填充方案,如PKCS#1 v2.0中定义的Optimal Asymmetric Encryption Padding (OAEP)。它内部使用散列来检查是否有错误。 C#对此有本地支持,如果发生错误,如破碎的密文或错误的密钥被使用,你将会得到一个错误。如果您对hybrid encryption(RSA +某些分组密码)感兴趣,我建议您使用RSA-OAEP以及经过验证的操作模式,如AES-GCM(可通过BouncyCastle在C#中获得)。这样,您可以确定所有(恶意)操作。

相关问题