如何在c#中填写RSAParameters值

我在我的项目中使用下面的代码进行加密,一切正常。

RSACryptoServiceProvider x_alg = new RSACryptoServiceProvider( ); // export only the public key RSAParameters x_public_params = x_alg.ExportParameters(false); // export the private key RSAParameters x_private_params = x_alg.ExportParameters(true); 

现在客户端更改了要求,他希望将所有RSAParameters值存储到配置文件中,并提供以下详细信息用于演示

   00000000000000000000000000000000000000000000000000000000000019C5 00000000000000000000000000000061 00000000000000000000000000000065 000DCD 0000000000000000000000000000003B 0000000000000000000000000000000000000000000000000000000000002C95 

00000000000000000000000000000065

00000000000000000000000000000071 0123456789ABCDEF111111111111111125FE2222222222222233333333334444 0000000000000000000000000000000000000000000000000000000000000000

现在,问题是当我导入RSAParameters值时,我收到了错误的数据exception

您遇到的问题是您的客户提供给您的XML不符合反序列化为RSAParameters类型的对象所需的格式

我运行此代码来显示XML序列化程序生成的XML是什么样的

 var provider = new RSACryptoServiceProvider(); var parameters = provider.ExportParameters(true); var x = new XmlSerializer(parameters.GetType()); x.Serialize(Console.Out, parameters); Console.WriteLine(); 

它生成的输出类似于:

  AQAB ruCEpD3XnR...g/waE= 

90amUU3dDazsqN9+...jJUQ==

tQv5hGehNLLmv4aC...NfUQ== azJiiZ6itPoBQph...zBcQ== OmewiOw9bxi/o82...f44Q== wNohk0NNl...YDg== fNOOWp46FckcvtI+...PpXAE=

其中…是截断输出。 您的客户提供的内容看起来像是超集(密钥,文本和密码不在参数列表中),但格式有点不同。

您可以要求他们以完全所需的格式提供数据,然后从中进行序列化; 或者您可以接受它们的格式,将其反序列化为XML并通过将XML内容映射到RSAParameters对象上的相应字段来手动构建RSAParameters对象。 您还需要弄清楚他们想要对密钥,文本和密码数据做什么,因为这些将在此过程中丢失。

从您提供的示例结构看起来,那里有额外的数据,您可能(或可能不)能够提供。

  • 创建一个包装类
  • 包装器属性调用转换函数将Base64转换为Hex
  • XmlElement属性用于控制输出格式
  • 密码和文本不在RSAProperties中,因此客户端必须为您指定它们

    [XmlRoot(“Project”)] public class RSAWrapper {[XmlIgnore] public RSAParameters RsaWrap {get; set;}

     // replicate Key for Text and Cipher, subject to client's specs private LenghtyValue _key = null; [XmlElement] public LenghtyValue Key{ get{ return (_key!=null) ? _key.Value : null;} set{ _key = (value!=null) ? new LenghtyValue { Value = value} : null;} } // replicate Exponent for D, DP, DQ, InverseQ, Modulus, P and Q [XmlElement] public LenghtyValue Exponent{ get{ return new LenghtyValue { Value = ToHexFromB64(RsaWrap.Exponent);} // look up how to convert this } set {} } public class LenghtyValue{ [XmlText] public string Value{get;set;} [XmlAttribute("length")] public int Length {get{ return (""+Value").Length;} set{}} } 

    }

//然后使用上面的类:…. RSACryptoServiceProvider x_alg = new RSACryptoServiceProvider();

 RSAParameters x_public_params = x_alg.ExportParameters(false); // or true RSAWrapper wrapForClient = new RSAWrapper { RsaWrap = x_public_params, Key = "1024", // or whatever size you have Cipher = "???", // whatever this field means per client specs Text = "???", // whatever this field means per client specs } // with simplifications.... XmlSerializer xser = new XmlSerializer(typeof(RSAWrapper)); xser.Serialize(File.Create(yourFileName), wrapForClient);