2017-02-14 159 views
1

所以,我需要的是未來:RSA加密和解密使用X509certificate2

  1. 創造發展certifiactes,得到一個客戶端和一個服務器
  2. 檢索通過API,它是從客戶端編碼的密碼和解碼它在服務器上

現在,我設法創建了以下this link certifiactes。在那裏的女孩一步一步地指導如何獲得自簽名certifiactes,把它們放在商店,等等...現在,我有問題的部分:

我設法使用此加密我的數據代碼:

public static string Encrypt(string stringForEncription, string PathToPrivateKey) 
    { 
     X509Certificate2 myCertificate; 
     try 
     { 
      myCertificate = new X509Certificate2(PathToPrivateKey, "Test123"); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to open key file."); 
     } 

     RSACryptoServiceProvider rsaObj; 
     if (myCertificate.HasPrivateKey) 
     { 
      rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 
     } 
     else 
      throw new CryptographicException("Private key not contained within certificate."); 

     if (rsaObj == null) 
      return String.Empty; 

     byte[] decryptedBytes; 
     byte[] array = Encoding.UTF8.GetBytes(stringForEncription); 
     try 
     { 
      decryptedBytes = rsaObj.Encrypt(array, false); 
      //decryptedBytes = rsaObj.Encrypt(Convert.FromBase64String(Base64EncryptedData), false); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to encrypt data."); 
     } 

     // Check to make sure we decrpyted the string 
     if (decryptedBytes.Length == 0) 
      return String.Empty; 
     else 
      return System.Text.Encoding.UTF8.GetString(decryptedBytes); 
    } 

對於PathToPrivate密鑰變量我正在使用我的客戶ClientCert.pfx的路徑。我不知道我是否應該使用任何其他,但這裏是該文件夾的卡扣與所有我做的證書:現在

enter image description here

,對於解密,我使用下面的代碼:

public static string DecryptEncryptedData(string Base64EncryptedData, string PathToPrivateKey) 
    { 
     X509Certificate2 myCertificate; 
     try 
     { 
      myCertificate = new X509Certificate2(PathToPrivateKey, "Test123"); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to open key file."); 
     } 

     RSACryptoServiceProvider rsaObj; 
     if (myCertificate.HasPrivateKey) 
     { 
      rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 
     } 
     else 
      throw new CryptographicException("Private key not contained within certificate."); 

     if (rsaObj == null) 
      return String.Empty; 

     byte[] decryptedBytes; 
     try 
     { 
      decryptedBytes = rsaObj.Decrypt(Convert.FromBase64String(Base64EncryptedData), false); 
     } 
     catch (Exception e) 
     { 
      throw new CryptographicException("Unable to decrypt data."); 
     } 

     // Check to make sure we decrpyted the string 
     if (decryptedBytes.Length == 0) 
      return String.Empty; 
     else 
      return System.Text.Encoding.UTF8.GetString(decryptedBytes); 
    } 

而且不管我嘗試這樣做,它給了我異常:

{"The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters. "} 

真的會apreciate有人幫助我。

+0

@KayLee試過了,沒有工作,證明是好的,關鍵是有的,我認爲這個問題是在轉換爲Base64String和Base64String –

+0

嘗試測試DecryptEncryptedData(「你好」,串PathToPrivateKey);也許,同樣的異常信息會根據我的經驗顯示出來。這意味着參數格式不正確(未正確加密)。希望這提供了一些線索。我確定這是關於byte,base64string,decryptedplainstring的格式。仔細分析一些像MSDN這樣的示例博客,並不難。 –

+0

我將在明天上午回顧我的代碼後再回來。這是深夜。 –

回答

0

你得到錯誤的原因是你試圖從Convert.FromBase64String的字符串中得到一個實際上不是base64字符串的值。

加密數據後,應該將字節數組轉換爲base-64字符串。 爲此使用Convert.ToBase64String

return Convert.ToBase64String(decryptedBytes); 

然後你解密行會的工作:

decryptedBytes = rsaObj.Decrypt(Convert.FromBase64String(Base64EncryptedData),FALSE);

+0

Convert.ToBase64String(stringForEncription);返回字符串,而不是byte [],有什麼建議嗎? –

+0

好的,明白了你的意思,我返回 Convert.ToBase64String(decryptedBytes);然後在decrtypt方法中,我得到: {「參數不正確。\ r \ n」} –

+0

在哪條線路上出現此錯誤? – Zesty

0

這不是您可能期望的確切答案,但我在這裏寫作,因爲它的評論太長。

我認爲解密本身沒有任何問題(我已經找到你的代碼的例子博客與PHP加密)這就是爲什麼我說我對加密字符串是解密的目標好奇。

我也在努力瞭解幾個月的安全性,現在我一起使用對稱(AES)和不對稱(RSA)。瞭解是非常重要的,每個人都需要時間..

RSA是不對稱和單向的,這意味着加密只能通過公鑰完成,而解密只能通過私鑰完成。 您在加密方法中使用私鑰,它似乎只是從解密中複製而來。

Zesty的答案只適用於格式。您還需要了解格式。我們需要將加密和解密中的Convert.ToBase64String和Convert.FromBase64String從byte到base64string,反之亦然。然而,這base64string不只是簡單的像「你好」,但 「SABlAGwAbABvACAAVwBvAHIAbABkAA ==」你看here

我好心建議使用完整的解決方案(未半一個像PHP加密)這樣blog使加密和解密而且都是和諧的。

最後,我還評論說,如果加密是從客戶端完成的,並且您不只有好用戶,您需要考慮如何防止黑人用戶。

我希望我的經驗有助於理解最重要的安全。