日期:2014-05-17  浏览次数:20922 次

关于用RSACryptoServerProvider导出公钥的奇怪问题,求帮助
对于一个snk或pfx文件,我用sn.exe导出公钥是160个字节,这和用AssemblyName.GetPublickKey()读取到的一致。

但我用RSACryptoServerProvider导出的公钥确只有148个字节,相差12个字节。仔细对比了一下,差别就是开始的12个字节上,即用RSACryptoServerProvider导出的缺少:002400000480000094000000这个开头。

而且我用RSACryptoServerProvider的ImportCspBlog(AssemblyName.GetPublickKey())这样导入签名组件中的公钥,提示出错,“不正确的提供程序版本”。

我想可能是需要对RSACryptoServerProvider参数进行相应的设置,才能和GetPublickKey()这些一致,但是不知道怎么设置。

谁能帮帮我,谢谢。

------解决方案--------------------
公钥实际长度是148,那12位是导出时候带的头部信息,参看MSDN
http://msdn.microsoft.com/zh-cn/library/ms232463(v=vs.110).aspx

多余的12位自己处理吧
------解决方案--------------------
直接把最前面的12个字节去掉就可以了。


byte[] bytes = AssemblyName.GetPublickKey();
byte[] publicKey = bytes.Skip(12).ToArray();
rsa.ImportCspBlog(publicKey);


160个字节的格式则是PUBLICKEYBLOB的基础上,加上一些额外包装。??????????额外包装为4个字节的?签名算法;4个字节的散列算法;以及4个字节的钥匙长度。这额外的12字节,加上PUBLICKEYBLOB的148字节,总好是160字节。

下列为伪代码表示(前12个字节正好是002400000480000094000000):

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct PUBLICKEYBLOB
{
    //.Net wrapper
    public int signatureAlg;             //CALG_RSA_SIGN=0x2400
    public int hashAlg;                  //CALG_SHA1=0x8004
    public int blobLength;               //148
    ...