概括地說,這是我的問題:使用Base64編碼的公鑰來驗證RSA簽名
private string publicKeyString = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVGUzbydMZS+fnkGTsUkDKEyFOGwghR234d5GjPnMIC0RFtXtw2tdcNM8I9Qk+h6fnPHiA7r27iHBfdxTP3oegQJWpbY2RMwSmOs02eQqpKx4QtIjWqkKk2Gmck5cll9GCoI8AUAA5e0D02T0ZgINDmo5yGPhGAAmqYrm8YiupwQIDAQAB";
/* Some transformation required, using publicKeyString to initiate a new RSACryptoServiceProvider object
*/
//for now:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] selfComputedHash = new byte[]; //left out of the example
byte[] signature = new byte[];
bool result = rsa.VerifyHash(selfComputedHash, CryptoConfig.MapNameToOID("SHA1"), signature);
正如你所看到的,問題是啓動與給定的Base64編碼的公共密鑰字符串的新的RSACryptoServiceProvider。我已經能夠使用對象RSAParameters進行實例化,該對象使用OpenSSL shell命令從此公鑰字符串派生出來的Modulus和Exponent加載到byte []中。但是由於這個公鑰可能會在將來發生變化,我希望能夠將它以原始形式存儲在數據庫中。必須有一個更直接的方式來處理這個問題。
到目前爲止,我讀過的很多示例通過將生成的私鑰和公鑰導出並導入到密鑰容器對象並在同一段代碼中使用它,從而避免了「傳輸'一些字符串中的關鍵字形式不足。有些人在StackOverflow和其他網站上都表達了同樣的問題,但我還沒有找到令人滿意的答案。
任何想法都是值得歡迎的。
背景信息: 我的通信夥伴從一個可變長度的輸入字符串計算一個20字節的SHA1哈希,它由ASCII編碼消息的幾個字段中包含的信息組成。然後這個哈希值與我的合作伙伴的私鑰進行RSA簽名,並與ASCII消息一起發送給我。抵達後,我自己計算SHA1哈希,使用ASCII消息中的相同字段,然後嘗試驗證這些字段是否未通過調用VerifyHash進行更改。
關鍵是以兩種形式提供:普通和'noNL'。所述NONL版本包含在上述代碼中,普通版本是這樣的:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVGUzbydMZS+fnkGTsUkDKEyFO
GwghR234d5GjPnMIC0RFtXtw2tdcNM8I9Qk+h6fnPHiA7r27iHBfdxTP3oegQJWp
bY2RMwSmOs02eQqpKx4QtIjWqkKk2Gmck5cll9GCoI8AUAA5e0D02T0ZgINDmo5y
GPhGAAmqYrm8YiupwQIDAQAB
-----END PUBLIC KEY-----
謝謝,這很容易。我將研究BouncyCastle庫,但是您確定無法僅使用.NET本身的加密庫來完成此操作嗎? – jscheppers 2012-02-15 08:38:01
@jscheppers:你可以像poupou建議的那樣手動完成它,但是沒有直接支持.NET中的格式。快速搜索可以揭示這個手動解碼的例子:http://www.jensign.com/JavaScience/dotnet/pempublic/pempublic.cs,但看起來有點麻煩。 – 2012-02-15 09:00:26
我認爲我更喜歡你的BouncyCastle解決方案,然後;)我已經在我目前的實施中嘗試過它,它的工作原理。我會將你的帖子標記爲答案! – jscheppers 2012-02-15 09:22:41