C#中已签名程序集的公钥结构是什么?

使用此代码检索公钥字节…

var pubKey = AppDomain.CurrentDomain.DomainManager.EntryAssembly .GetName().GetPublicKey(); 

密钥的开头(前32个字节)的这种常见结构是什么? 它不是ASN.1,它可能不是变量。 我可以谷歌并获得重复。

 // 00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00 00 24 00 00 52 53 41 31 

是全部逆转还是只是其中的一部分(例如最后的模数)? 52 53 41 31是一串RSA1 。 我的密钥模数是1024位,所以我一直在寻找描述长度的东西。 0x040000 04 BE)为1024(位), 0x80为128(字节,1024/8)。

 // 00 04 00 00 01 00 01 00 

这些最后4到6是公众指数吗? 大端还是小端? 最后一个null是终结符还是间隔符?

调查RSAPKCS1SignatureFormatterRSAPKCS1SignatureDeformatter实现(.NET和Mono)并不容易。

删除了编辑,回答了自己的问题…除非有人提出更好的答案或添加详细信息,包括为什么。

我无法停止咬指甲试图从CALG_RSA_SIGN = 0x00002400向后工作,偶然发现RSAPUBKEY,然后是PUBLICKEYSTRUC,最后是PublicKeyBlob。 那么现在我可以正式解析它。 想知道.NET框架中是否已有任何结构用于处理此问题?

https://msdn.microsoft.com/en-us/library/ee442238.aspx

哦,嘿,这些神奇的数字看起来很熟悉。 他们的意思是什么…

它是https://msdn.microsoft.com/en-us/library/ms232463.aspx吗?

 // 00 24 00 00 // 0x00002400 LE // PublicKeyBlob SigAlgId ALG_ID = CALG_RSA_SIGN // 04 80 00 00 // 0x00008004 LE // PublicKeyBlob HashAlgId ALG_ID = CALG_SHA1 // 94 00 00 00 // 0x00000094 LE // PublicKeyBlob cbPublicKey dword = 148 // sizeof(PUBLICKEYSTRUC) is 8 + sizeof(RSAPUBKEY) is 12 + sizeof(modulus) is 128 = 148 // 06 // 0x06 // PUBLICKEYSTRUC bType byte = PUBLICKEYBLOB // 02 // 0x02 // PUBLICKEYSTRUC bVersion byte = CUR_BLOB_VERSION // 00 00 // 0x0000 LE // PUBLICKEYSTRUC reserved word = 0 // 00 24 00 00 // 0x00002400 LE // PUBLICKEYSTRUC aiKeyAlg ALG_ID = CALG_RSA_SIGN // 52 53 41 31 // 'RSA1' // RSAPUBKEY magic dword // 00 04 00 00 // 0x00000400 LE // RSAPUBKEY bitlen dword // 01 00 01 00 // 0x00010001 LE // RSAPUBKEY pubexp dword // public modulus reversed follows in (bitlen/8) bytes 

所以使用这些信息(无法让rsaCsp.ImportParameters正常工作)……

 var rsaCsp = new RSACryptoServiceProvider(BitLength); rsaCsp.FromXmlString(string.Format( "{1}{0}", Convert.ToBase64String(PubExp), Convert.ToBase64String(PubMod))); 

现在,您已从程序集的SN PK中获得用于签名身份validation的有效rsaCsp。