C# 中已签名程序集的 public 键的结构是什么?
What is the structure of the public key of a signed assembly in C#?
使用此代码检索 public 个关键字节...
var pubKey =
AppDomain.CurrentDomain.DomainManager.EntryAssembly
.GetName().GetPublicKey();
密钥开头(前 32 个字节)的这个通用结构是什么?
它不是 ASN.1,它可能不是可变的。我可以 google 它并得到重复。
// 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 位,所以我一直在寻找描述长度的东西。
0x0400
(00 04
B.E.) 将是 1024(位),0x80
将是 128(字节,1024/8)。
// 00 04 00 00 01 00 01 00
这些最后的 4 到 6 是 public 指数吗?大端还是小端?最后一个 null 是终止符还是间隔符?
对 RSAPKCS1SignatureFormatter
和 RSAPKCS1SignatureDeformatter
的实现(.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(
"<RSAKeyValue><Modulus>{1}</Modulus><Exponent>{0}</Exponent></RSAKeyValue>",
Convert.ToBase64String(PubExp), Convert.ToBase64String(PubMod)));
现在您有一个有效的 rsaCsp 用于来自程序集的 SN PK 的签名验证。
使用此代码检索 public 个关键字节...
var pubKey =
AppDomain.CurrentDomain.DomainManager.EntryAssembly
.GetName().GetPublicKey();
密钥开头(前 32 个字节)的这个通用结构是什么? 它不是 ASN.1,它可能不是可变的。我可以 google 它并得到重复。
// 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 位,所以我一直在寻找描述长度的东西。
0x0400
(00 04
B.E.) 将是 1024(位),0x80
将是 128(字节,1024/8)。
// 00 04 00 00 01 00 01 00
这些最后的 4 到 6 是 public 指数吗?大端还是小端?最后一个 null 是终止符还是间隔符?
对 RSAPKCS1SignatureFormatter
和 RSAPKCS1SignatureDeformatter
的实现(.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(
"<RSAKeyValue><Modulus>{1}</Modulus><Exponent>{0}</Exponent></RSAKeyValue>",
Convert.ToBase64String(PubExp), Convert.ToBase64String(PubMod)));
现在您有一个有效的 rsaCsp 用于来自程序集的 SN PK 的签名验证。