关于用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
...