簡體   English   中英

如何在c#中填寫RSAParameters值

[英]How can I fill in RSAParameters value in c#

我在我的項目中使用下面的代碼進行加密,一切正常。

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值存儲到配置文件中,並提供以下詳細信息用於演示

<project name="netCard Server1">
  <key length="256"></key>
  <D length="64">00000000000000000000000000000000000000000000000000000000000019C5</D>
  <DP length="32">00000000000000000000000000000061</DP>
  <DQ length="32">00000000000000000000000000000065</DQ>
  <Exponent length="6">000DCD</Exponent>
  <InverseQ length="32">0000000000000000000000000000003B</InverseQ>
  <Modulus length="64">0000000000000000000000000000000000000000000000000000000000002C95</Modulus>
  <P length="32">00000000000000000000000000000065</P>
  <Q length="32">00000000000000000000000000000071</Q>
  <text length ="64">0123456789ABCDEF111111111111111125FE2222222222222233333333334444</text>
  <cipher length ="64">0000000000000000000000000000000000000000000000000000000000000000</cipher>
</project>

現在,問題是當我導入RSAParameters值時,我收到了錯誤的數據異常

您遇到的問題是您的客戶提供給您的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();

它生成的輸出類似於:

<RSAParameters>
  <Exponent>AQAB</Exponent>
  <Modulus>ruCEpD3XnR...g/waE=</Modulus>
  <P>90amUU3dDazsqN9+...jJUQ==</P>
  <Q>tQv5hGehNLLmv4aC...NfUQ==</Q>
  <DP>azJiiZ6itPoBQph...zBcQ==</DP>
  <DQ>OmewiOw9bxi/o82...f44Q==</DQ>
  <InverseQ>wNohk0NNl...YDg==</InverseQ>
  <D>fNOOWp46FckcvtI+...PpXAE=</D>
</RSAParameters>

其中...是截斷輸出。 您的客戶提供的內容看起來像是超集(密鑰,文本和密碼不在參數列表中),但格式有點不同。

您可以要求他們以完全所需的格式提供數據,然后從中進行序列化; 或者你可以接受他們的格式,它反序列化XML和構建RSAParameters手動對象通過對XML內容映射到相應的字段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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM