在C#中加载ASN.1 / DER编码的RSA密钥对

我在Crypto ++中创建了DER编码的RSA密钥对,以及密码。 它们是Base64Encoded字符串。 我首先将数据从Base64解码为字节数组,但我不知道如何将它们加载到RSACryptoServiceProvider

 static void Main() { string pbkeystr = "mypublickey"; string pvkeystr = "myprivatekey"; string cipherstr = "mycipher"; byte[] pbkey = Convert.FromBase64String(pbkeystr); byte[] pvkey = Convert.FromBase64String(pvkeystr); byte[] cipher = Convert.FromBase64String(cipherstr); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); //Set keys here.. //Decrypt the cipher using private key rsa.Decrypt(pvkey, false); } 

没有设置键的function。 我发现唯一的东西是ImportParameters方法,它采用RSAParameters类,它包括pqn ,模数,指数等。我无法访问这些。

有什么办法可以把键加载成字符串吗? 如何将密钥加载到RSACryptoServiceProvider

有什么办法可以把键加载成字符串吗? 如何将密钥加载到RSACryptoServiceProvider中?

从你的其他Crypto ++问题, 如何在Crypto ++中加载Base64 RSA密钥 ,看起来你只有公钥和私钥,因为你使用了DEREncodeBERDecode 。 也就是说,您具有RSA参数,而不是主题公钥信息和私钥信息。 您的密钥缺少OID标识符和版本号。 事情很好。

从密码互操作性:代码项目中的密钥 ,您需要一个C#类,在您对Base64进行解码后解析ASN.1 / DER。 CodeProject文章提供了一个名为AsnKeyParser的C#类来读取ASN.1 / DER并返回一个RSAParameters以加载到CSP中。

AsnKeyParser类的代码大约有800行,还有其他五个支持文件可以实现,所以它不适合放在这里。 你应该自己下载。 感兴趣的文件称为CSInteropKeys.zip

一旦您AsnKeyParser类,它就像下面的RSA公钥一样简单。 私钥将类似,代码在CodeProject站点上给出。

 // Your ASN.1/DER parser class AsnKeyParser keyParser = new AsnKeyParser("rsa-public.der"); RSAParameters publicKey = keyParser.ParseRSAPublicKey(); // .Net class CspParameters csp = new CspParameters; csp.KeyContainerName = "RSA Test (OK to Delete)"; csp.ProviderType = PROV_RSA_FULL; // 1 csp.KeyNumber = AT_KEYEXCHANGE; // 1 // .Net class RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); rsa.PersistKeyInCsp = false; rsa.ImportParameters(publicKey); 

链接到另一个站点上的文件是不受欢迎的,但我不知道如何提供信息。 放在答案中的源代码太多了。


为了完整起见,.Net不会使互操作变得容易。 他们不接受ASN.1 / DER或PEM。 相反,.Net接受密钥的一些XML表示。 我相信你可以在RFC 3275,XML-Signature Syntax和Processing中找到它。 微软没有为您说明这一点 。 当我编写Code Project文章时,我将它拼凑在一起。

也许除了ASN.1 / DER和PEM之外,我们还应该为Crypto ++添加一个类来反编译XML。