|
Вопрос # 2 988/ вопрос открыт / |
|
Здравствуйте!
Объясните пожалуйста "на пальцах" механизм шифрования с открытым ключем. Как формируются ключи и как обмениваются. И подскажите библиотеку для Delphi реализующиую этот механизм.
 |
Вопрос задал: Roman Novikov (статус: Посетитель)
Вопрос отправлен: 12 июля 2009, 16:06
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 18 июля 2009, 23:12; участников в обсуждении: 3.
12 июля 2009, 17:52: Вопрос перемещён из тематического раздела Delphi » Работа с сетями и протоколами в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.
|
Roman Novikov (статус: Посетитель), 13 июля 2009, 19:26 [#2]:
Меня интересует такая информация: где какие ключи генерируются и какие кому передаются. То есть у меня клиент должен авторизоваться у сервера - что ему делать? Естественно сам я писать библиотеку не буду - нужна готовая.
|
|
Вадим К (статус: Академик), 13 июля 2009, 19:54 [#3]:
все Вам нужно, а взять и почитать литературу - лень.
Обычно используются несиммитричные ключи (искать по слову RSA), в этом случае клиент может зашифровать сообщение свое, но если это сообщение перехватить, то дешифровать его сложно (в оригинале - только перебор). Сервер же со своей стороны имеет пару ключей и может расшифровать.
В некоторых случаях изготовляют два аппаратных ключа, которые работают в паре. Ключ доставляется с помощью службы безопасности (живых людей) и по сети явно и неявно не передается.
Я не думаю, что у Вас там суперсекретная организация и надо сделать суперсекретный протокол с супернадёжностью. (Если бы было бы наоборот и задавали такие вопросы, то начальство уволило бы давно. За то, что не знаем базовых вещей).
Подсуммируем.
Если будет использоваться инди или что то подобное, используем ssl и не морочим голову. Всё шифрование будет сделано автоматически (то есть прозрачно для Вашего кода) и будет достаточно надежно. И наверно знать, какие и куда ключи передаются и не надо будет. Зачем забивать голову лишним?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Roman Novikov (статус: Посетитель), 17 июля 2009, 13:33 [#4]:
Читать не лень. Литаратуры много и по разным темам, а качественной и по тем вопросам которые возникают нету. Читать можно и до пенсии. Нужно же знать что читать, теории дается море, а применяют из этого всего небольшую часть индивидуально по ситуации. Для меня как не профильного специалиста (по образованию я математик) это очень важно, я хочу перевалифицироваться и быть хотя бы на уровне хорошего прикладного программиста. Знающий товарищ на словах гораздо быстрее и понятнее все объяснит, а уже потом можно наворачивать на этот камок знаний дополнительные из других источников. Это огромная экономия времени. Я, вообще говоря, сторонник наставничества и работы в парах/группах, так наиболее эффективно, на мой взгляд, можно перенять опыт.
Степень секретности - к примеру, информация о валютных операциях совершенных трейдером, информация для брокера, счета и пароли доступа, личная и финансовая информация в БД. Сейчас я над этим не работаю, к сожалению, но считаю, что знать механизм обязан, поэтому и разбираюсь.
Да, речь идет про RSA. Как-то участвовал в проекте где другой программист писал сетевой компонент с использованием RSA. Но насколько я помню там у обоих сторон по 2 ключа: своим ключем они расшифровывают сообщения, а чужим ключем зашифровываю. Мне не понятен механизм генерации обмена(или вообще не меняются) ключами, общая информация для начала нужна - что, зачем и для чего.
|
|
Вадим К (статус: Академик), 17 июля 2009, 13:46 [#5]:
И об этом спрашивает математик? RSA базируется на хорошей математике, а реализация, это обычно мелочи. Читать лекции по математике не буду, сами подымайте старые лекции и читайте.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Roman Novikov (статус: Посетитель), 18 июля 2009, 23:00 [#6]:
Так ведь знать жежь нужно что читать. И выбрать то что нужно. Прочитать одну книгу Шнайера чего стоит, а выбора в итоге почти нет.
Почитал про RSA, алгоритм понял. Оказывается большие ключи взламывают уже сегодня. Скоро это перестанет быть большой проблемой для мошенников.
Вопросы:
1. Для чего используют хеширование, например MD5 в паре с RSA?
2. Какие есть хорошие библеотеки для дельфи с RSA? RSA можно кодировать только строки или он применим к потоку байт?
|
|
Roman Novikov (статус: Посетитель), 18 июля 2009, 23:12 [#7]:
Шифрование с открытым ключом
Криптография — это наука о защите данных. Алгоритмы криптографии с помощью математических методов комбинируют входной открытый текст и ключ шифрования, в результате чего получаются зашифрованные данные. Применение криптографии обеспечивает надежную передачу данных и предотвращение их получения несанкционированной стороной. Применяя хороший алгоритм шифрования, можно сделать практически невозможным, с точки зрения необходимых вычислительных и временных ресурсов, взлом защиты и получения открытого текста подбором ключа. Для быстрого выполнения подобного преобразования необходим расшифровывающий ключ.
В традиционном шифровании с секретным ключом (secret key) (симметричное шифрование) зашифровывающий и расшифровывающий ключи, совпадают. Стороны, обменивающиеся зашифрованными данными, должны знать общий секретный ключ. Процесс обмена информацией о секретном ключе представляет собой брешь в безопасности вычислительной системы. Фундаментальное отличие шифрования с открытым ключом (асимметричное шифрование) заключается в том, что зашифровывающий и расшифровывающий ключи не совпадают. Шифрование информации является односторонним процессом: открытые данные шифруются с помощью зашифровывающего ключа, однако с помощью того же ключа нельзя осуществить обратное преобразование и получить открытые данные. Для этого необходим расшифровывающий ключ, который связан с зашифровывающим ключом, но не совпадает с ним. Подобная технология шифрования предполагает, что каждый пользователь имеет в своем распоряжении пару ключей — открытый ключ (public key) и личный или закрытый ключ (private key). Свободно распространяя открытый ключ, вы даете возможность другим пользователям посылать вам зашифрованные данные, которые могут быть расшифрованы с помощью известного только вам личного ключа. Аналогично, с помощью личного ключа вы можете преобразовать данные так, чтобы другая сторона убедилась в том, что информация пришла именно от вас. Эта возможность применяется при работе с цифровыми или электронными подписями. Шифрование с открытым ключом имеет все возможности шифрования с закрытым ключом, но может проходить медленнее из-за необходимости генерировать два ключа. Однако этот метод безопаснее. Появление пары "личный ключ/открытый ключ" привело к возникновению нескольких новых технологий, наиболее важными из которых являются цифровые подписи, распределенная аутентификация, соглашение о секретном ключе, достигаемое с применением открытого ключа, и шифрование больших объемов данных без предварительного соглашения о секретном ключе. Существует несколько хорошо известных алгоритмов шифрования с открытым ключом. Некоторые из них, например RSA (Rivest-Shamir-Adelman) и шифрование с помощью эллиптической кривой (Elliptic Curve Criptography, ECC), являются алгоритмами общего употребления в том смысле, что они поддерживают все упомянутые выше операции. Другие алгоритмы поддерживают только некоторые операции. К ним относятся: алгоритм цифровой подписи (Digital Signature Algorithm, DSA), используемый только для работы с цифровыми подписями, и алгоритм DiJfie-Hetlman (D-H), применяемый только для соглашений о секретных ключах. Алгоритмы шифрования, используемые безопасностью IP (IP Security), подробнее описаны в данной главе в разделе "Безопасность IP".
Алгоритм шифрования данных
с открытым ключом RSA Алгоритм шифрования данных с открытым ключом является наиболее переспективным в настоящий момент (RSA - Rivest, Shamir and Aldeman - его изобретатели). Понятия: Простое число - делится только на 1 и на само себя; Взаимно простым- не имеют ни одного общего делителя, кроме 1; Результат операции i mod j - остаток от целочисленного деления i на j. Чтобы использовать алгоритм RSA, надо сначала сгенерировать открытый и секретные ключи выполнив следующие шаги: 1) Выберем два очень больших простых числа p and q. 2) Определим n, как результат умножения p on q (n= p*q). 3) Выберем большое случайное число, которое назовем d. Это число должно быть взаимно простым с результатом умножения (p-1)*(q-1). 4) Определим такое число е, для которого является истинным следующее соотношение (e*d) mod ((p-1)*(q-1))=1. 5) Hазовем открытым ключем числа e и n, а секретным ключом - чмсла d и n.
================================
Теперь, чтобы зашифровать данные по известному ключу {e,n}, необходимо сделать следующее: - разбить шифруемый текст на блоки, каждый из которых может быть представлен в виде числа M(i)=0,1,2..., n-1( т.е. только до n-1). - зашифровать текст, рассматриваемый как последовательность чисел M(i) по формуле C(i)=(M(I)^e)mod n. Чтобы расшифровать эти данные, используя секретный ключ {d,n}, необходимо выполнить следующие вычисления: M(i) = (C(i)^d) mod n. В результате будет получено множество чисел M(i), которые представляют собой исходный текст.
================================
Hу, чтобы более наглядно представить алгоритм RSA, приведу следующий пример: Зашифруем и расшифруем сообщение "САВ" по алгоритму RSA. Для простоты буду использовать маленькие числа(на практике - нужно брать намного большие). 1) Выберем p=3 and q=11. 2)Определим n= 3*11=33. 3) Hайдем (p-1)*(q-1)=20. Следовательно, d будет равно, например, 3: (d=3). 4) Выберем число е по следующей формуле: (e*3) mod 20=1. Значит е будет равно, например, 7: (e=7). 5) Представим шифруемое сообщение как последовательность чисел в диапозоне от 0 до 32 (незабывайте, что кончается на n-1). Буква А =1, В=2, С=3. Теперь зашифруем сообщение, используя открытый ключ {7,33} C1 = (3^7) mod 33 = 2187 mod 33 = 9; C2 = (1^7) mod 33 = 1 mod 33 = 1; C3 = (2^7) mod 33 = 128 mod 33 = 29; Теперь расшифруем эти данные, используя закрытый ключ {3,33}. M1=(9^3) mod 33 =729 mod 33 = 3(С); M2=(1^3) mod 33 =1 mod 33 = 1(А); M3=(29^3) mod 33 = 24389 mod 33 = 2(В); Все, данные расшифрованы.
================================
Криптостойкость алгоритма RSA основывается на предположении, что исключительно трудно определить секретный ключь по известному, поскольку для этого необходимо решить задачу о существовании делителей целого числа. Данная задача является NP-полной, и, как следствие этого факта, не допускает cейчас эффективного (полиноминального) решения. Более того, сам вопрос существования эффективных алгоритмов решения NP-полных задач является до настоящего времени открытым. Если Вы используете числа, состоящие из 200 цифр(такие и надо использовать при шифровании данных), для несанкционированной расшифровки придется генерировать огромное число операций (около 10^23).
P.S/ Данные, приведенные выше, не должны быть использованы в незаконных целях!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|