2016-11-25 67 views
0

首先让我说我不是一个加密专家,但我知道的基本知识。C#(.NET)RSACryptoServiceProvider导入/导出x509公钥blob和PKCS8私钥blob

我希望能够到:

  1. 从X509公共密钥团
  2. 得到一个的RSACryptoServiceProvider例如,从PKCS8私人密钥团
  3. 出口从的RSACryptoServiceProvider公共密钥得到一个的RSACryptoServiceProvider实例实例作为x509公钥Key blob
  4. 将RSACryptoServiceProvider实例的私钥作为PKCS8 blob导出
+1

您正在使用私钥进行加密并使用公共密钥进行解密。这被称为数字签名,并且在Java和C#中有特定的方法。真的是你想要做什么?通常使用公钥进行加密,并使用私钥进行解密。 – pedrofb

+1

另请注意,导入RSA公钥并不是微不足道的.http://stackoverflow.com/questions/18091460/rsa-read-publickey – pedrofb

+0

@pedrofb我已经上了它。 我必须解析二进制asn.1 X509PKInfo到一个RSAParameters对象中。一旦完成,我将提供一个代码解决方案。 – loveMeansNothing

回答

0

整天四处寻找之后,我发现这个repository (thanks a lot jrnker)我选择,我需要能够代码来满足目标1,2和3

由于Jrnker唯一提供了获取从一个的RSACryptoServiceProvider PKCS1 blob(以及我需要的是来自PKCS8 blob的RSACryptoServiceProvider)我一直在寻找目标编号4.然后,我发现Michel Gallant's "opensslkey.cs",我选择了需要的编码以达到目标编号4.

然后我开始用所需的方法和类来编译一个类。

这里是我的试听课:

using System; 

namespace RSAKeyTests 
{ 
    class Demo 
    { 
     static void Main(string[] args) 
     { 
      //EXPORTED KEYS 
      string importedPublicKeyBase64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhbVC4aUR+XRCepBcPlod69wruXqwW9yL/YJYvuaQ33QxUoAehQ0z4SuphHwEPxQp/qLqucmE6XKlEeTksFAmaGM88uuGessqMZmdu9WFhc07MWLTCifR43IRtGEeWeFSWjUI6mNRrShP3QQ3+Z6e7w+HRA2RpmgNgEhJRvECHAKpcpHvP9o5Sq6q/dIAyR6NEjRFhfud27rFtnWrLj+ZmIsScemvks4vh8V3n8EzxxRE8nzVuZYr4v4NNH+q95XgIadHZ1Y6ICXJgX2NfacNRQl9+SEv0Wo8lbmFSIO3jHqyiWuSugv7R3/rQPRXHT6HJAtw0tBiPOBitMkTzqOvIwIDAQAB"; 
      string importedPrivateKeyBase64 = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCFtULhpRH5dEJ6kFw+Wh3r3Cu5erBb3Iv9gli+5pDfdDFSgB6FDTPhK6mEfAQ/FCn+ouq5yYTpcqUR5OSwUCZoYzzy64Z6yyoxmZ271YWFzTsxYtMKJ9HjchG0YR5Z4VJaNQjqY1GtKE/dBDf5np7vD4dEDZGmaA2ASElG8QIcAqlyke8/2jlKrqr90gDJHo0SNEWF+53busW2dasuP5mYixJx6a+Szi+HxXefwTPHFETyfNW5livi/g00f6r3leAhp0dnVjogJcmBfY19pw1FCX35IS/RajyVuYVIg7eMerKJa5K6C/tHf+tA9FcdPockC3DS0GI84GK0yRPOo68jAgMBAAECggEAJ/Dalr8RnHvPM/+Vnoaa847kfNaaggZixwq96eDEHAwAg82D0Gj+O2AolkvZlOI4HTmbdn4tNvMpPiwq6EQ5BOvIFCSpGltAMmraBHcnGK4S5ZDIy/rTJuc3RLPSNjUpvYqkLCgZCOnG2ZXeBrIMdgskc/69qIDir5RoV0m9QJJYU7pfrfErWYr/eqb1t7eZtTBAg+LAjKUMUq68WoJiBSBRPbAvlyFoc6tyk0ftngsF4OPVbwZQyYC2vLmxVrr1/YQbEgjpuJwQ0bONL6G9PAH6O+h10ILk9nyJY2c9gOXU0tz+foJ47naM12wCJETEy9JGeAiN4NLz5wRKTZzZwQKBgQDCOEJGDgtmSM0bDv4vPuxbacFgGTgRAKTs6sG9E1Cf3LNBLDP9OhfRkXFc192PmQRAktaZAN89zXeGxK1tLbJ3003qKXw05K3KOksVjJ7AH4Yhurv3VWmFZB8pryUsxIp+rm/5GLf4LfptUmBO6R4+jTfJVRBtK4A9KmkbY7BjgwKBgQCwPWayTgd0fmDqJxptWfPThcUw3/cG6EWTpnx1dSOdaBHzewRwq/8/i4vs314/onLggXgZTIkPU7y8ylTmz5KcaPIQkmRSSSL0Y2yzMGcHnylj7ysgBLw23k/PVzGSsMZ6ly7lE03SNQ3tyg6u0lc3pbT8ZLHf/x913stxSSiT4QKBgQChdgnKmZRqhS1WSGGSP3pZCJNFY9HTeLijaQqFOFB3hg/Tp37VDv2MMKCQsbi0z13UnP4glrQAehbbCBixQiMzMIx+ldx3UIEWNN4E3TGAwPROiCIJnY0q4rBxg/SgwgftBvF5oU4X2YluZuQ/1ddZ4ya0jq4oQ9jJgL9+kKKsJwKBgQCndbBfPEVZK7xqwT0bKp3EHxd/mU/gAFQcN9WKxgNRTdHAyOMvLD8c4jvSl2u2i2UcbejwIQkaxzZPLPH/XrywYgegN3mbtmLAVLi0iwla9KEfk+ImSlmMyTCMkw1HlTECyySEBhOr6T2S9Kt+8d5twcZ3DDb34DLEjS5CNoGYAQKBgDCEyhrg2lwyYwrL26ohNNuzgiabC5IKCgHlMpsUQjoCid9awCSb2iROf7iZIBoDyzXqgEQWTAf2clpJxgHz0necVw2sXP8wGcJXJ+e/lXNfPaC4z2QRnQ6i2iV88jRlWLK+S403hGnK0L/SDu9LtBhHwy6r/qRGT14ourqS6x7O"; 
      byte[] importedPublicKeyBytes = Convert.FromBase64String(importedPublicKeyBase64); 
      byte[] importedPrivateKeyBytes = Convert.FromBase64String(importedPrivateKeyBase64); 

      //PRINT INFO 
      Console.WriteLine("------ IMPORTED KEY PAIR: ------\n"); 
      Console.WriteLine("PUBLIC KEY:\n"+importedPublicKeyBase64+"\n\n"); 
      Console.WriteLine("PRIVATE KEY:\n" + importedPrivateKeyBase64 + "\n\n"); 

      //GENERATING RSACRYPTOSERVICEPROVIDER FROM X509 PUBLIC KEY BLOB 
      using (var providerFromX509pubKey = RSAKeyUtils.DecodePublicKey(importedPublicKeyBytes)) 
      { 
       providerFromX509pubKey.PersistKeyInCsp = false; //DO NOT STORE IN KEYSTORE 

       //EXPORT TO X509 PUBLIC KEY BLOB 
       byte[] x509pubKeyBytes = RSAKeyUtils.PublicKeyToX509(providerFromX509pubKey.ExportParameters(false)); 

       //CONVERT TO BASE64 
       string x509pubKeyBase64 = Convert.ToBase64String(x509pubKeyBytes); 

       //PRINT INFO 
       Console.WriteLine("------ PUBLIC KEY TO EXPORT ------"); 
       Console.WriteLine("Public key to export matches imported? "+importedPublicKeyBase64.Equals(x509pubKeyBase64)); 
       Console.WriteLine(x509pubKeyBase64+"\n\n"); 
      } 

      //GENERATING RSACRYPTOSERVICEPROVIDER FROM PKCS8 PRIVATE KEY BLOB 
      using (var providerFromPKCS8privKey = RSAKeyUtils.DecodePrivateKeyInfo(importedPrivateKeyBytes)) 
      { 
       providerFromPKCS8privKey.PersistKeyInCsp = false; //DO NOT STORE IN KEYSTORE 

       //EXPORT TO PKCS8 PRIVATE KEY BLOB 
       byte[] pkcs8privKeyBytes = RSAKeyUtils.PrivateKeyToPKCS8(providerFromPKCS1privKey.ExportParameters(true)); 

       //CONVERT TO BASE64 
       string pkcs8privKeyBase64 = Convert.ToBase64String(pkcs8privKeyBytes); 

       //PRINT INFO 
       Console.WriteLine("------ PRIVATE KEY TO EXPORT ------"); 
       Console.WriteLine("Private key to export matches imported? " + importedPrivateKeyBase64.Equals(pkcs8privKeyBase64)); 
       Console.WriteLine(pkcs8privKeyBase64); 
      } 

       //PREVENTS THE PROGRAM FROM EXITING 
       Console.ReadKey(); 
     } 
    } 
} 

Here's the "RSAKeyUtils" class i've compiled.

我希望这可以给别人有用。

-2

首先,Java中的byte与.Net中的byte不一样。 Java只有有符号整数,所以Java byte范围从-128到127,而.Net byte范围从0到255.但我不确定,如果这是问题,因为Base64字符串依赖于位模式。尝试在正范围内使用较大的类型,并仅使用较低的8位。其次,有关错误提供者版本的消息可能表明上述原因,或者可能仅仅是一种误导性文本,这并不会真正起到帮助作用。我记得我曾经遇到过同样的错误信息,并且很难找到真正的原因。几分钟前的快速搜索还没有成功。在我的情况下,我有一个完全的其他情况,所以我不能直接指出你的问题。相反,我会建议检查填充,加密模式,base64翻译和相关的东西围绕RSA算法,并尝试找到一种替代方法来达到你以前想要的效果。在去那里的路上,你可能会碰到实际的问题。

+0

填充,加密模式和base64翻译都很好,因为我很久以前就一直依赖它们,从来没有遇到过问题。问题出在肯定的关键代表... – loveMeansNothing