Неиллюзорный адъ криптографии
Oct. 4th, 2008 07:15 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Разбирался, как из 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 фреймворке я его не нашел), сопоставил секции в последовательности и компоненты ключа и сгенерил таки из линуксового ключа дотнетовский. Причем ноль в начале данных компонент пришлось вырезать руками, потому-что парсер из моно тоже возвращает этот лишний ноль.
Честно вам скажу, все-таки в микрософте люди работают более вменяемые, чем те, кто придумал формат 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 фреймворке я его не нашел), сопоставил секции в последовательности и компоненты ключа и сгенерил таки из линуксового ключа дотнетовский. Причем ноль в начале данных компонент пришлось вырезать руками, потому-что парсер из моно тоже возвращает этот лишний ноль.
no subject
Date: 2008-10-04 04:52 pm (UTC)no subject
Date: 2008-10-05 03:11 pm (UTC)no subject
Date: 2008-10-04 05:53 pm (UTC)no subject
Date: 2008-10-04 05:58 pm (UTC)no subject
Date: 2008-10-04 08:39 pm (UTC)Да и генератору ключей от openssl я как-то больше доверяю, чем тому, что там RSACryptoServiceProvider, в недрах NSA червями нашпигованный, нагенерит :)
no subject
Date: 2008-10-04 07:51 pm (UTC)Затем, что софт (и ключи эти всякие к нему комплектные) часто работает не сам по себе, а его приходится прикручивать к другому софту (и так 15 раз). А разработчики проприетарного софта на самом деле - люди отмороженные и про "все библиотеки понимают" - эт Вы сильно погорячились. Т.е. понимать то они может и понимают, но когда обратно выдают результат - это всё в пропорции к объёмом абсента, потреблённым в процессе кодописания аффтарами.
Что в свои сертфикаты/ключи для доступа к ихним информационным системам всякие банки засовывают - это ж, например, просто уму непостижимо. И когда обёртку пишешь, чтобы одно с другим стыкануть - лучше бы хотя бы приблизительно представлять, какие поля тебе прислали, а какие - решили что ты без них перебьёшься.
С этой точки зрения XML представление с отдельными полями - явно лучше, чем base64-style блок, в котором то ли стандартный ключ, то ли, например, кроме самого ключика - IP-адрес твоей системы заXORенный с фазой луны дня окончания действия ключа.
no subject
Date: 2008-10-05 11:18 am (UTC)no subject
Date: 2008-10-05 11:39 am (UTC)no subject
Date: 2008-10-04 08:37 pm (UTC)no subject
Date: 2008-10-05 11:19 am (UTC)no subject
Date: 2008-10-05 11:31 am (UTC)Потому что мегагуру, которые берутся разрабатывать, думают исключительно о том, как бы поохренительнее показать свою самость, чем о том, что они на самом деле делают.
no subject
Date: 2008-10-05 12:06 pm (UTC)no subject
Date: 2008-10-05 12:33 pm (UTC)гыг.
уж извините.
no subject
Date: 2008-10-05 01:14 pm (UTC)no subject
Date: 2008-10-05 01:46 pm (UTC)no subject
Date: 2008-10-06 08:30 pm (UTC)Таких уёбищных приложений, написанных на чём-то типа MFC, через жопу заинтегренных с вебом, через нашпингованные ActiveX странички... Бля, если это - приличный софт, то покажите мне уродский софт, пожалуйста.
no subject
Date: 2008-10-07 01:15 am (UTC)По мне так "приличный софт" - это такой софт, который невозможно заменить чем-то ещё, руководствуясь сисадминским нравстенным чувством, "софт уважаемых контрагентов" с которым, хоть на стенку влезь, но надо сынтегрироваться.
Таких уёбищных приложений, написанных на чём-то типа MFC, через жопу заинтегренных с вебом, через нашпингованные ActiveX странички... Да, Вы примерно уловили мою идею. К перечислению следует добавить "экспортирующих свои ключи мужской половой хуй знает в каком формате" - о чём, собственно говоря, и речь.
no subject
Date: 2008-10-07 06:14 am (UTC)no subject
Date: 2008-10-05 12:40 pm (UTC)no subject
Date: 2008-10-05 01:09 pm (UTC)no subject
Date: 2008-10-05 01:21 pm (UTC)no subject
Date: 2008-10-06 09:04 am (UTC)no subject
Date: 2008-10-06 10:25 am (UTC)no subject
Date: 2008-10-06 03:06 pm (UTC)no subject
Date: 2008-10-06 03:30 pm (UTC)В общем, бессмысленное усложнение решения, судя по всему, из-за решения разработчиков протокола не заморачиваться с разделением одного потока на данные и команды. Практически, они переложили решение с себя на других.
no subject
Date: 2008-10-06 04:21 pm (UTC)Схема реализованная в ФТП позволяет делать вещи хоть и не часто требуемые но весьма полезные. Например используя только ФТП можно с системы А соединиться с системами В и С и передать файл с В на С. :)
Не стоит также забывать что FTP разработан в 1985 году.
Telnet и DNS - в 1983, TCP в 1981.
И до сих пор все эти протоколы активно используются, несмотря на то что прошло уже больше 20-ти лет.
ЗЫ. А что значит "Практически, они переложили решение с себя на других"? Какое решение?
no subject
Date: 2008-10-06 04:54 pm (UTC)no subject
Date: 2008-10-07 01:26 am (UTC)no subject
Date: 2008-10-07 11:40 am (UTC)Дело не в том что кто-то мыслит категориями 1985-го года, а в том что почему то за более чем 20 лет этот "безумный" ФТП не был задавлен более удобным протоколом, как например случилось ч тем же гофером.
Может все же проблема не в ФТП, а? %))
no subject
Date: 2008-10-07 01:22 am (UTC)ну да, разумеется, (де)мультиплексирование команд и данных в одном потоке силами разработчика прикладного софта - это у нас теперь называется 'одной сущностью', а когда оно же переложено на _штатный_ стек сетевого протокола - это у нас "две сущности".
Практически, они переложили решение с себя на других.
Да-да. Настоящие самураи внутрь каждой утилиты встраивают целиком операционную систему собственного написания ;-)
no subject
Date: 2008-10-07 11:44 am (UTC)Ведь всем очевидно, что реализовать обмен командами и данными по одному сокету на порядки проще чем заморачиваться с безумным и непонятным IPC! :)
А уж написание сервера то как облегчается :)))
no subject
Date: 2008-10-05 01:19 pm (UTC)no subject
Date: 2008-10-05 01:48 pm (UTC)