2015-02-21 6 views
1

Используя этот код для получения открытого ключа байт ...Какова структура открытого ключа подписанной сборки в 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 бит, поэтому я искал что-то, что описывало длину. 0x0400 (00 04 B.E.) будет 1024 (бит), 0x80 будет 128 (байты, 1024/8).

// 00 04 00 00 01 00 01 00 

Являются ли эти последние 4-6 общественным экспонентом? Большой или маленький конец? Является ли последний null терминатором или спейсером?

Расследования в реализациях (.NET и Mono) от RSAPKCS1SignatureFormatter и RSAPKCS1SignatureDeformatter нелегко.

Удалены изменения, отвечая на собственный вопрос ... если кто-то не придумает лучшего ответа или не добавит детали, включая whys.

ответ

1

Я не мог перестать кусать ногти, пытаясь отступить от CALG_RSA_SIGN = 0x00002400, и наткнулся на RSAPUBKEY, затем PUBLICKEYSTRUC и, наконец, PublicKeyBlob. Ну теперь я могу разобрать его формально. Интересно, существует ли какая-либо структура, которая уже используется в .NET Framework для обработки этого?

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 ПК вашей сборки.

+1

Еще одно предостережение ... PubExp должен быть преобразован в байты и опущен нулевой байт (обрезать верхние 0 байтов, например 01 00 01 00 -> 01 00 01 -> AQAB, а не AQABAA ==). – TylerY86