7

プロジェクトで暗号化に以下のコードを使用していましたが、すべて正常に機能していました。

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 値をインポートするときに、Bad Data Exception が発生することです。

4

2 に答える 2

8

問題は、顧客から提供された 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ます。また、鍵、テキスト、暗号データ​​はこのプロセスで失われるため、彼らが何をしたいのかを理解する必要があります。

于 2012-11-28T18:04:04.537 に答える
2

提供したサンプル構造から、提供できる(またはできない)追加のデータがあるように見えます。

  • ラッパークラスを作成する
  • Base64を16進数に変換するために変換関数を呼び出すラッパープロパティ
  • 出力形式を制御するための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);
于 2012-11-30T18:07:21.803 に答える