2013-04-16 2 views
0

Пожалуйста, сначала прочтите вопрос, поскольку заголовок не очень ясен, и я не могу задать свой вопрос в нескольких словах.Создание и подписание открытого/закрытого ключа Пара программно

Мой сценарий таков: Я создаю приложение P2P. Одноранговый узел во время установки генерирует пару открытых и закрытых ключей и загружает открытый ключ на мой центральный сервер. Когда одноранговый узел A хочет связываться со сверстником B, он загружает открытый ключ B, и происходит нормальное шифрование и передача данных.

Мне нужно немного хэдз-ап для создания этой пары открытого/закрытого ключа программным способом. Опять мне нужен этот открытый ключ однорангового узла, который должен быть подписан секретным ключом центрального сервера, чтобы узнать его подлинность.

Возможно ли создать частный вид CA или любой другой способ? Если кто-то может помочь мне понять это создание, подписание и т. Д. С точки зрения программирования, это было бы здорово. Я получаю много идей в поиске Google, но не очень много в кодировании. Я новичок в криптографии, поэтому любая другая идея реализовать то же самое будет полезна.

Примечание: я не могу использовать сторонний ЦС. И я не использую сертификаты для аутентификации, а для шифрования.

Спасибо.

ответ

0

классический сценарий ИПК ... вы хотите CA ...

все ваши коллеги должны знать сертификат общественного CA загодя ...

раз в одноранговых регистров с сервером, его должен зашифровать свой собственный ключ, чтобы сервер мог быть уверен, что полученный ключ не был подделан ...

для структуры данных, вероятно, вы должны использовать X509

с точки зрения программистов:

одноуровневых хочет зарегистрировать с новой парой ключами ...

-> генерировать пару ключей
- > заполните идентификационные данные сертификата и приложите открытый ключ (то, что вы сейчас называете «запрос сертификата»)

-> enc rypt запрос симметрично (AES-CBC-256 со случайным IV выглядит как хороший выбор)
-> зашифровать сим- метрический ключ и отправить его вместе с зашифрованным запросом и открытым текстом IV на сервер (необязательно, включить сервер при условии одноразового номера или addidional данных сеанса в зашифрованной части)

на стороне сервера:

расшифровывать, проверять данные, особенно информацию идентификации запроса , если это нормально, принять запрос (ID часть + общественности) и подпишите, что с помощью ключа CA

сообщите об этом партнеру и передайте подписанный сертификат (ы) осел она не включает в себя какие-либо секреты, которые могут быть открытым текстом или шифруются с помощью прилагаемого ключа для пэра A)

когда вам необходимо установить контакт между коллегами, вам нужна только некоторая контактной информация:

если сверстниками X хочет связаться со сверстником A, все, что вам нужно передать, - это адрес, с которым можно связаться A ... X затем связывается с A и запрашивает идентификатор («Привет? это? пожалуйста, дайте мне свой сертификат, и вот мой сертификат. ») ... после обмена сертификатами подписи проверяются ... если CA sigs в порядке, обе стороны генерируют случайные числа (« nonces », number-once-used) и зашифровывать их с помощью открытых ключей из полученного и подтвержденного сертификата и передавать их другому партнеру ... после получения зашифрованного значения дешифруется и повторно зашифровывается с помощью ключа других сторон и отправляет обратно ... после получения этого расшифровки значение с вашим собственным личным ключом и убедитесь, что это тот же номер, который вы отправили ... проверено подлинное соединение, и теперь вы можете перейти к передаче симметричных ключей и начать передачу зашифрованных данных

, если вы считаете, что можете жить без аутентификации другой партнер, вы можете сразу начать передачу зашифрованных данных после того, как вы проверили сертификат CA на их сертификате ... но учтите, что в этом случае attac ker может получать данные, которые не для него (он не может расшифровать его, но он может притворяться другим сверстником ...)

+0

Большое спасибо. Я думал о чем-то подобном этой реализации, но у меня были и другие реализации, и я не мог понять, в какую из них пойти. Другой метод, который, как я думал, заключался в том, чтобы сервер создавал пару ключей и сертификат во время регистрации и подписывал сертификат и отправлял его партнеру. Но я думаю, что я пойду с этой реализацией. И я не создаю CA, как в реальном ЦС, однако у меня будет собственный сертификат и пара ключей для центрального сервера. И используйте это, чтобы подписать все сертификаты сверстников. –

+0

Можете ли вы сказать мне какие-либо последствия для безопасности, если вы не используете установленное программное обеспечение CA и сами выполняете такую ​​задачу. Подписание части кажется очень простым, и я не вижу смысла иметь программное обеспечение CA для этого. –

+0

хорошо ... что такое программное обеспечение CA? ... если вы посмотрите на openssl, он включает в себя «крошечный CA» ... кучу скриптов вокруг основных операций openssl ... то, что вы строите, является CA ... вопрос факта ...у вас CA будет самозаверяющий сертификат ... хорошо ... посмотрите на другие ЦС ... все корневые ЦС в вашем браузере имеют самоподписанные сертификаты ... единственное различие: они доставляются вместе с браузером или операционной системой ... ваш будет доставлен с вашим приложением ... этот CA будет таким же реальным, как и любой другой ... – DarkSquirrel42

1

Причина, по которой вы получаете множество обращений к концепции, но не программирование, заключается в том, что трудно найти хороший протокол, а не , что сложно на самом деле запрограммировать. Это правильный порядок, чтобы пойти с этим тоже, этот протокол, который вы не можете просто запрограммировать и документировать позже.

Это не имеет большого значения, если вы хотите использовать сертификаты/закрытый ключ для подписания или для шифрования. Дело в том, что публичному ключу нужно доверять. Если вы не можете доверять открытому ключу, вы не можете гарантировать, что шифрование было выполнено для правильного объекта. Это означает, что, например, peer A шифровался с использованием открытого ключа M вместо B. Это почти всегда проблема, если только вы не заинтересованы только в подслушивающих атаках.

Как кажется, у вас есть центральный сервер, кажется логичным использовать иерархическую модель доверия. Для такой системы PKI с использованием сертификатов X509 и центрального ЦС имеет наибольший смысл. Вы можете использовать систему CA на базе OpenSSL или любое другое бесплатное решение CA, такое как EJBCA или какое-то решение на базе Windows.

Когда у вас работает CA, вас еще нет. Вам нужен метод, чтобы сверстники могли доверять корневому сертификату центра сертификации. После этого вам нужен метод для CA, чтобы доверять запросам сертификата, отправляемым сверстниками. Без дополнительной информации трудно сказать, какой метод подойдет вам лучше всего.

Вы должны только беспокоиться о программировании, когда вы все это вычислили (как минимум).

+0

Это много бесплатных советов, должно вас обвинить :) –

+0

Можете ли вы указать мне любой хороший учебник по X509 и реализации? –

Смежные вопросы