2011-08-26 17 views
7

Zauważyłem, że podstawowe zespoły .NET mają PublicKey = 00000000000000000400000000000000. Nie tylko jest krótszy niż te sn.exe pozwala na wygenerowanie (min 384 bitów), ale także ma wiele zer .Dość specjalny klucz PublicKey w rdzeniach .NET

Jak wygenerować klucz podpisu z takim fantazyjnym kluczem publicznym?

+0

Czy obejrzałeś dokumentację narzędzia do podpisywania 'sn.exe' z zestawu Windows SDK? –

+0

@dario_ramos: tak, zrobiłem. –

+1

Chcesz, aby twój klucz publiczny był czymś specyficznym, lub po prostu miał wiele zer? Czy mogę zapytać dlaczego? –

Odpowiedz

5

To jest klucz publiczny zdefiniowany przez standard ECMA.

To do czynienia z trzema sprzecznych wymagań:

  1. mechanizm, który zapewnia, że ​​zespoły są podpisane przez ich twórców i nie mógł zostać stworzony przez oszukańczym drugiej strony.
  2. Ten CLI definiuje się otwarcie w taki sposób, że inni ludzie mogą zaimplementować wersję (Mono byłaby prawdziwym przykładem).
  3. Żeby udostępnić standardową bibliotekę klas z każdą wersją frameworka.

Te trzy rzeczy nie mogą się wydarzyć w tym samym czasie!

Jeśli tworzę wersję .NET (punkt 2), to muszę podać wersję standardowej biblioteki (punkt 3), która musi być zaufana (punkt 1), więc muszę ją podpisać udowodnij, że jestem Microsoft. Och, czekaj, nie jestem Microsoftem! (eh, punkt 2 ponownie).

Zamiast tego, co się dzieje:

  1. tworzę publiczno-prywatnego pary kluczy. Ludzie zaufani do budowania nowych wersji wersji złożeń w mojej implementacji biblioteki szkieletowej mają dostęp do klucza prywatnego, klucz publiczny może być znany każdemu, kto wykonuje jakąkolwiek pracę związaną z implementacją CLI.

  2. Oznaczam odpowiednie złożenia jako podpisane kluczem odpowiadającym kluczowi publicznemu 00000000000000000400000000000000 (zdefiniowanemu w standardzie ECMA), chociaż rzeczywiście zostały one podpisane kluczem prywatnym wspomnianym powyżej.

  3. W kodzie w CLI każda kontrola zespołu, który twierdzi, że została podpisana kluczem odpowiadającym kluczowi publicznemu 00000000000000000400000000000000, jest sprawdzana za pomocą prawdziwego klucza publicznego. Jeśli to się sprawdzi, to może zostać podpisane tylko przez kogoś, komu ufamy, budując te zgromadzenia.

Oczywiście ramy MS nie będą ufać nasze zespoły, Mono nie będzie im zaufać, a my nie ufa żadnej z nich, bo wszyscy mamy różne klucze prawdziwe odpowiadające standardowym kluczem ECMA. Który powinien być.

Tymczasem fakt, że 00000000000000000400000000000000 nie pasuje do żadnego prawdziwego ważnego klucza publicznego, oznacza, że ​​nie można go kolidować z żadnym innym kluczem publicznym.

+0

+ Jon Hanna, Dzięki za szczegółowe wyjaśnienie! Podejrzewałem, że klucz jest jakoś wyjątkowy, a teraz widzę, jak. –