2015-10-23 47 views
5

我正在嘗試使用PHP爲服務器和客戶端的C#表單應用程序創建一個聯機數據庫應用程序。 在服務器上,我使用PHPSecLib使用公共RSA密鑰加密簡單字符串。然後C#應用程序收到該字符串並嘗試使用相應的私鑰對其進行解密。 字節在服務器上以base64編碼,並由C#再次解碼爲字節。我使用PHPSecLib創建了密鑰對。System.IO.IOException:----- END RSA PRIVATE KEY not found

這是我在客戶端應用程序中使用的代碼:

public string rsa_decrypt(string encryptedText, string privateKey) { 
     byte[] bytesToDecrypt = Convert.FromBase64String(encryptedText); 
     Pkcs1Encoding decrypter = new Pkcs1Encoding(new RsaEngine()); 
     //the error occurs on this line: 
     AsymmetricCipherKeyPair RSAParams = (AsymmetricCipherKeyPair)new PemReader(new StringReader(privateKey)).ReadObject(); 

     decrypter.Init(false, RSAParams.Private); 
     byte[] decryptedBytes = decrypter.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length); 
     string decryptedString = Convert.ToBase64String(decryptedBytes); 
     return decryptedString; 
    } 

但是,我得到上面^指定的行下面的錯誤。

類型 'System.IO.IOException' 的未處理的異常發生在 BouncyCastle.Crypto.dll

其他信息:----- END RSA私有密鑰未發現

我相信密鑰對組合沒有任何問題,因爲在我甚至嘗試解密任何內容之前,我都會收到錯誤信息。目前 的privateKey參數是硬編碼到腳本中使用此格式:

string privateKey = "-----BEGIN RSA PRIVATE KEY-----XXXXXXXX-----END RSA PRIVATE KEY-----"; 

所以,在我看來實際上包含字符串中的頁腳...我已經調試到處一派,但我似乎無法到解決這個問題。我對RSA & Bouncycastle很新,所以也許我只是使用錯誤的方法。

希望你能幫忙,謝謝! - G4A

P.S.這是我的第一個Stackoverflow問題,我剛剛創建了一個帳戶,所以如果你也可以就我提出這個問題的方式給我一些反饋;大!

+2

IIRC你需要在預先邊界之間的一條線; ''-----開始RSA私鑰----- \ r \ nXXXXXXXX \ r \ n -----結束RSA私鑰-----「' –

+1

歡迎來到SO,G4A!這個問題沒有太大的錯誤,很好的問題,出色的格式。有四點需要進一步改進:1)以實際問題結束(你知道,以問號結尾)2)「希望你能幫忙,謝謝!-4GA」不是必需的,實際上並不是首選3)PS應該是在問題下面的評論,4)請回復我們以幽默的方式回答我們的問題AlexK。當他提出一個解決方案(他不確定,因此評論而不是答案)。 –

+1

這樣做@AlexK。我確實已經嘗試過,但我忘了回車。你能否刪除你的評論,並將其作爲答案,以便我可以給你業力,或無論它叫什麼。並感謝@Maarten Bodewes我會記住它。最後,對於遲到的答案感到抱歉;我想我的電子郵件尚未正確設置。 – G4A

回答

6

您需要添加前/後密封邊界文本和Base64編碼數據之間的新的生產線,所以:

string privateKey = "-----BEGIN RSA PRIVATE KEY-----\r\nXXX\r\n-----END RSA PRIVATE KEY-----"; 

這是因爲PEM規範允許兩者之間的其他文字標題的存在。

+1

專業提示 - 確保不使用逐字串字符串('@「...」'),它會忽略'\ n'和'\ r'轉義序列。 –