解决方案 »

  1.   

    http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rsa.fromxmlstring(v=vs.100).aspx
      

  2.   

    以及 http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rsa.exportparameters(v=vs.100).aspx
      

  3.   

    FromXmlString,不行哦,它要求从xml导入
      

  4.   

    A单位是我们无法控制的,A单位只能提交X509Certificate2.GetPublicKeyString()方法得到的16进制字符串,无法让A单位提交一个XML
      

  5.   

    使用X509Certificate2.GetPublicKeyString()难度比较大。它格式用的是DER Encoding of ASN.1 Types。
    比如3082010A0282010100D93E8921F06B5A2E9...0203010001
    30:表示SEQUENCE类型
    82010A:表示SEQUENCE长度为010A(其中82超过80,表示后面有2个字节的长度信息)
    02:表示整数类型
    820101:表示整数长度为0101(十进制为257)
    00D93E89...:该整数就是modulus,00用来表示正整数,扣除00后还有256个字节,因此modulus为256个字节
    最后是Exponent
    0203010001: 02表示整数,03长度为3,010001就是Exponent既然A单位可以得到GetPublicKeyString,建议A单位转为提交
    X509Certificate2.PublicKey.Key.ToXmlString(),给出的xml类似:
    <RSAKeyValue>
      <Modulus>2T6J...Yvy3PTw==</Modulus>
      <Exponent>AQAB</Exponent>
    </RSAKeyValue>
    该xml直接给出了Modulus和Exponent,并可以直接被RSACryptoServiceProvider导入。
    如果注意观察,其中Exponent的AQAB就是010001这3个字节的Base64编码,而Modulus的2T6J...就是D93E89...的Base64编码。
    DER Encoding of ASN.1 Types可参考
    http://msdn.microsoft.com/en-us/library/windows/desktop/bb648640%28v=vs.85%29.aspx
    http://en.wikipedia.org/wiki/Distinguished_Encoding_Rules#DER_encoding
      

  6.   


    谢谢楼上各位,解释的非常详细。我尝试把“3082010A0282010100D93E8921F06B5A2E9...0203010001”前面的18位截去,把“D93E89...0203010001”转成Base64编码,来直接组XML,但没找到合适的方法吧““D93E89...0203010001””转成“2T6J...Yvy3PTw==”。算了,放弃了还是直接让A单位导出XML,B单位导入XML吧谢谢楼上各位了