简体   繁体   English

将openssl公钥导入C#RSACryptoServiceProvider

[英]Import openssl public key to C# RSACryptoServiceProvider

I am create server side program in c++, program create RSA public and private key with openssl library and then public key distribute over the network for clients. 我正在用C ++创建服务器端程序,该程序使用openssl库创建RSA公钥和私钥,然后通过网络为客户端分发公钥。 in clients side i wrote c# program first get public key and then encrypt data. 在客户端,我编写了C#程序,首先获取公钥,然后对数据进行加密。 but i can not add public key to RSACryptoServiceProvider. 但是我不能将公共密钥添加到RSACryptoServiceProvider。

is there a way to import RSA public key to RSACryptoServiceProvider? 有没有一种方法可以将RSA公钥导入RSACryptoServiceProvider?

-----BEGIN RSA PUBLIC KEY----- MIIBCAKCAQEAsgVkBAQPdtRtICOqWdZ0ZiMAb9UvUX0BaxANN22bL5RzTJAL+PmG QKaA61B1m0NPOjdIIXMwkaAzXOmzuNwKm2Ugb8jO15B6ovAhe73jAoltFFdi10Te zCJgT8/xLAWt1mOXCAK9vD4Pv5LMN76BF+YjEVvylQ3l87255ElZrP4UluCGj0U3 uczW8+Cqao3QoL6xSxPU9jSK0FT/OhAL312cAXYbnaiJH+wAf1kkv4ez28XAlFId MlCmh2n8YSuxk1GdOXaps8IoluDzmHeQ8vk2quQMPpFXzfCayBoPm9lVPOjOQkAH 8ClJda0Uy052N5aE0BuyX1KRxOSdRRKk9wIBAw== ----- BEGIN RSA公钥----- MIIBCAKCAQEAsgVkBAQPdtRtICOqWdZ0ZiMAb9UvUX0BaxANN22bL5RzTJAL + PMG QKaA61B1m0NPOjdIIXMwkaAzXOmzuNwKm2Ugb8jO15B6ovAhe73jAoltFFdi10Te zCJgT8 / xLAWt1mOXCAK9vD4Pv5LMN76BF + YjEVvylQ3l87255ElZrP4UluCGj0U3 uczW8 + Cqao3QoL6xSxPU9jSK0FT / OhAL312cAXYbnaiJH + wAf1kkv4ez28XAlFId MlCmh2n8YSuxk1GdOXaps8IoluDzmHeQ8vk2quQMPpFXzfCayBoPm9lVPOjOQkAH 8ClJda0Uy052N5aE0BuyX1KRxOSdRRKk9wIBAw ==

-----END RSA PUBLIC KEY----- -----结束RSA公钥-----

You can do this using BouncyCastle , which is, unfortunately, one of the only ways to solve this problem. 您可以使用BouncyCastle做到这一点,不幸的是,这是解决此问题的唯一方法之一。

PemReader reader = new PemReader(new StreamReader(File.Open(file, FileMode.Open)));
AsymmetricCipherKeyPair = (AsymmetricCipherKeyPair)reader.ReadObject();
reader.Reader.Close();

This code isn't tested, so some of the method names might be a tad off. 此代码未经过测试,因此某些方法名称可能会有点过时。 You can then use the static methods in the DotNetUtilities class to convert to RSACryptoServiceProvider . 然后,您可以使用DotNetUtilities类中的静态方法将其转换为RSACryptoServiceProvider

This is a sample code show how to add RSA public key to RSACryptoServiceProvider in c# 这是一个示例代码,展示了如何在c#中将RSA公钥添加到RSACryptoServiceProvider。

public Stream GenerateStreamFromString(string s)
{
     MemoryStream stream = new MemoryStream();
     StreamWriter writer = new StreamWriter(stream);
     writer.Write(s);
     writer.Flush();
     stream.Position = 0;
     return stream;
}

string publicKey = "-----BEGIN RSA PUBLIC KEY-----\nMIIBCAKCAQEAoNhWLaL11Zy4L6Cp2IDFv2JGnPkoRnFrKTy5b23uszzbSammdIwi\n6Wtr/7Zg3wmqlwt/yhH4F6rwSysB04xvMnWjuRsw2Kz4u7FHMPlgrIObGDFqcEms\nllNTA8xSWh/+TPfxWdAN5bpUwLYo6Mizl+VStL4CtVQFS8/mQSUnCju3csfxNGlk\nPQdbwZWB/5DdswrhkUcob8wl3bCCZCz3zWzMNJFTgTEiZQr+qTtuY7ST+fmpO33r\nDJoboysiGPKUkQixKcG2s1jJJkQircAHkmiQPS6PlUapNahFNaPa3rh1zR4l5NN6\nxWudPYQhZ8VvD4C8eT2bfrUlsikAyXIX4QIBAw==\n-----END RSA PUBLIC KEY-----\n"
using (Stream stream = GenerateStreamFromString(publicKey))
{

      PemReader pemReader = new PemReader(new StreamReader(stream));
      AsymmetricKeyParameter publicKey = (AsymmetricKeyParameter)pemReader.ReadObject();
      pemReader.Reader.Close();
      Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters rsaPub = (Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters)publicKey;

      RSAParameters RSAKeyInfo = Org.BouncyCastle.Security.DotNetUtilities.ToRSAParameters(rsaPub);

      RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(2048);
      RSA.ImportParameters(RSAKeyInfo);

      byte[] encryptedData = RSA.Encrypt(plainText, true);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM