2012-10-16 29 views
5

我是新來的c#。在我將這些信息發佈到外部URL之前,我被要求加密一個字符串。我從外部應用程序獲得的所有輸入信息都是.der文件和.pem文件。他們要求我發送加密的(字符串)信息,以便他們能夠解密。c#加密,得到.der和.pem文件作爲輸入

我已閱讀了很多帖子,但無法得到確切的答案,我該如何解決這個問題。

我正在使用下面的代碼片段來讀取.pem文件並創建一個證書。但在上新增了X509Certificate2(certBuffer);一行丟給我一個「找不到請求的對象」的錯誤。我不確定我是否正朝着正確的方向前進。如果是的話,幫我弄清楚這個問題。否則告訴我一個方法。提前致謝!

var pem = System.IO.File.ReadAllText("C:\\Users\\bvarapr1\\Desktop\\fordsync\\public_qa.pem"); 
    byte[] certBuffer = GetBytesFromPEM(pem, "PUBLIC KEY"); 
    var certificate = new X509Certificate2(certBuffer);    
    RSACryptoServiceProvider provider = (RSACryptoServiceProvider)certificate.PrivateKey; 
    string testString = "DIGITALMOON"; 
    string encryptedVIN = RSAEnc(provider, testString); 

    byte[] GetBytesFromPEM(string pemString, string section) 
    { 
     var header = String.Format("-----BEGIN {0}-----", section); 
     var footer = String.Format("-----END {0}-----", section); 

     var start = pemString.IndexOf(header, StringComparison.Ordinal) + header.Length; 
     var end = pemString.IndexOf(footer, start, StringComparison.Ordinal) - start; 

     if (start < 0 || end < 0) 
     { 
      return null; 
     } 

     return Convert.FromBase64String(pemString.Substring(start, end)); 
    } 

回答

8
static void Main(string[] args) 
{ 
    System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(); 
    System.Security.Cryptography.RSAParameters rsaParam = rsa.ExportParameters(false); 
    rsaParam.Modulus = Convert.FromBase64String(System.IO.File.ReadAllText(@"C:\keys\public_key.pem").Replace("-----BEGIN PUBLIC KEY-----", "").Replace("-----END PUBLIC KEY-----", "")); 
    rsa.ImportParameters(rsaParam); 

    string msg = "This is a test."; 
    byte[] encValue = rsa.Encrypt(Encoding.UTF8.GetBytes(msg), false); 

    Console.WriteLine("Message Before Encryption: " + msg); 
    Console.WriteLine("Encrypted Message:\r\n" + Convert.ToBase64String(encValue)); 

    Console.WriteLine("\r\nPress any key to exit."); 
    Console.ReadKey(); 
} 
+2

此代碼的工作形成了我,但你的PEM文件需要將僅包含公開密鑰。我不知道你的公鑰是如何生成的,但我使用了「openssl genrsa -out private_key.pem 1024」。然後,我使用「openssl rsa -in private_key.pem -pubout -out public_key.pem」導出公鑰以供在上面的代碼中使用。 – Jacob