2017-05-08 114 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#中獲得)。這樣,您可以確定所有(惡意)操作。

相關問題