metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2008-10-04 07:15 pm

Неиллюзорный адъ криптографии

Разбирался, как из rsa-ключа, сделанного openssl или ssh-keygen сделать ключ в xml-формате для C# RSACryptoServiceProvider. Типа реализовать интероперабилити между .NET и тулсами из юниксового мира.


Честно вам скажу, все-таки в микрософте люди работают более вменяемые, чем те, кто придумал формат rsa-ключа. В C# все просто - ключик в xml-файле/строке, отдельные xml-тэги, Modulus, Exponent для паблик-ключа и плюс P,Q,DP,DQ,InverseQ,D - для приватного. В тэгах - значения в base64. Читабельно, понятно и доступно тому, кто слышал как эта асимметричная криптография работает. И парсится легко.

Формат же ключа, который создает ssh-keygen и openssl genrsa, хотя и стандартный и описан в rfc - это смерть, жопа и сатана.

Во-первых, описание этого формата я еле откопал, хотя оно и в rfc. Причем толку от описания было мало, быстрее получилось дампить ключ с помощью openssl asn1parse и смотреть содержимое.

Во-вторых, начало и конец оформлено строками -----BEGIN/END RSA PRIVATE KEY-----, а между ними - base64 блок. Т.е. формат меняется прямо внутри файла - строки конца и начала ни разу не являются валидным base64.

В-третьих, в base64 блок упихнуты все компоненты ключа, в виде ASN1 последовательности, формат, известный своей "адекватностью" для парсинга.

И, что самое интересное, openssl rsa in key -noout -text показывает компоненты ключа странно - дописывает в начало некоторых лишний ноль. При этом, openssl asn1parse показывает правильно - без нуля.

В итоге, выдрал из Mono asn1 парсер (почему-то в самом .net фреймворке я его не нашел), сопоставил секции в последовательности и компоненты ключа и сгенерил таки из линуксового ключа дотнетовский. Причем ноль в начале данных компонент пришлось вырезать руками, потому-что парсер из моно тоже возвращает этот лишний ноль.

[identity profile] golosptic.livejournal.com 2008-10-05 12:33 pm (UTC)(link)
которым работает любой приличный софт
гыг.
уж извините.

[identity profile] dizel-by.livejournal.com 2008-10-05 01:14 pm (UTC)(link)
ОК. А что из приличного софта не понимает этот формат? мэсэворд?

[identity profile] golosptic.livejournal.com 2008-10-05 01:46 pm (UTC)(link)
Я тут уже писал в другом треде - банковский софт всякий.

[identity profile] zamotivator.livejournal.com 2008-10-06 08:30 pm (UTC)(link)
Не подскажите, с каких это пор банковский софт - образец для подражания?
Таких уёбищных приложений, написанных на чём-то типа MFC, через жопу заинтегренных с вебом, через нашпингованные ActiveX странички... Бля, если это - приличный софт, то покажите мне уродский софт, пожалуйста.

[identity profile] golosptic.livejournal.com 2008-10-07 01:15 am (UTC)(link)
Знаете, мне какбэ...эээ... наплевать, что помянутый софт не удовлетворяет Вашим строгим эстетическим критериям.

По мне так "приличный софт" - это такой софт, который невозможно заменить чем-то ещё, руководствуясь сисадминским нравстенным чувством, "софт уважаемых контрагентов" с которым, хоть на стенку влезь, но надо сынтегрироваться.

Таких уёбищных приложений, написанных на чём-то типа MFC, через жопу заинтегренных с вебом, через нашпингованные ActiveX странички... Да, Вы примерно уловили мою идею. К перечислению следует добавить "экспортирующих свои ключи мужской половой хуй знает в каком формате" - о чём, собственно говоря, и речь.
Edited 2008-10-07 01:17 (UTC)

[identity profile] metaclass.livejournal.com 2008-10-07 06:14 am (UTC)(link)
Приличный, неприличный - с ним в любом случае взаимодействовать приходится. И лучше бы, чтобы его разработчики для взаимодействия пользовались XML, а не чем-нибудь вроде asn1.