Симметричные криптосистемы шифрования.  Симметричное и асимметричное шифрование для новичков

Мало кто знает как именно работает асимметричное шифрование. К примеру есть люди которые не считают протокол https какой-либо адекватной защитой передаваемых данных. И как правило на попытку убедить в обратном, они отвечают что-то в духе «если мы передаем зашифрованные данные, то мы должны сказать как их расшифровывать, а эту информацию можно перехватить и, следовательно, расшифровать данные». А на аргументы, что это не так и в основу положено асимметричное шифрование, поступает ответ «Ну и что?».

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

Хочу вынести суть данного поста в эту аннотацию: Запомните, асимметричное шифрование безопасно , естественно при выполнении всех условий. И чтобы доказать это я попробую описать алгоритм понятным языком, чтобы каждый смог понять, что он безопасен. Встречайте Алису, Боба и Еву и передачу их секретного сообщения под катом.

Кстати почему Алиса и Боб? Об этом есть кратенькая статья на википедии: Алиса, Боб и Ева . Чтобы было понятнее, Алиса и Боб хотят обменяться сообщениями, а Ева пытается эти сообщения перехватить и прочесть.

Немного истории

Криптография прошлых веков имела одну огромную проблему — проблема передачи ключей. В те времена существовали только так называемые «симметричные» шифры — шифры при котором данные шифруются и расшифровываются одним и тем же ключом.

К примеру, Алиса зашифровала некоторое сообщение и хочет отправить его Бобу. Естественно, чтобы Боб его прочитал, ему нужен ключ которым было зашифровано данное сообщение. И тут возникает проблема, как передать ключ чтобы его никто не смог перехватить. Пытливые умы предложат — пусть передают при личной встрече, а потом общаются сколько захотят. Да, не спорю, выход. А теперь представьте на секунду, что ваша интернет почта, перед тем как вы авторизируетесь в ней, потребует вашей поездки до физического местоположения сервера с почтой. Удобно? Пожалуй не очень.

Конечно ключ можно передавать по другому каналу связи. Но криптография рассматривает все незащищенные каналы связи как небезопасные. То есть передача ключа Бобу по телефону, например, считается небезопасной так, как ничто не мешает Еве прослушивать и телефон в том числе.

До 70-ых годов, эта проблема настолько стала привычной, что считался аксиомой тот факт, что для передачи сообщения нужно передавать и ключ которым сообщение зашифровано (причем некоторых люди до сих пор считают именно так). Но в 76 году Диффи и Хеллман предложили свой «метод экспоненциального обмена ключей». С этих годов и началось развитие асимметричных криптосистем.

Немножко реальной жизни

Прежде чем изучать какой либо алгоритм, нужно представить как он работает. И самый простой способ — это сравнить его с работой чего-то в реальности.

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

Естественно на почте прочитать это письмо не могут, но его не может прочитать и сам Боб, так как у него нет ключа которым закрыт замок. Алиса, конечно, может взять еще один железный ящик, положить в него ключ от предыдущего, и отправить его Бобу, но его Боб тоже не сможет открыть…

Единственный путь это все же сделать дубликат ключа и дать его Бобу при личной встрече…

И вот начинает казаться что обмен ключами является неизбежной частью шифрования — или все-таки нет?

Представим другую картину. Распишу пошагово:

  1. Алиса кладет свое письмо в железный ящик и, заперев его на замок, отправляет Бобу.
  2. Боб при получении ящика, (внимание!) берет свой замок и, дополнительно заперев им ящик, отправляет обратно.
  3. Алисе ящик приходит уже с двумя замками (напомню с первым замком Алисы от которого у нее есть ключ, и со вторым — Боба, от которого ключ есть есть только у Боба).
  4. Алиса снимает свой замок, и отправляет ящик обратно Бобу
  5. Бобу приходит ящик с уже одним его замком от которого у него есть ключ
  6. Боб отпирает оставшийся его замок своим ключом, и читает сообщение

Значение этой кратенькой истории огромно. Она показывает что два человека могут передавать секретное сообщение без обмена ключами. Вдумайтесь! Эта история фактически рушит все аксиомы на которых была построена тогдашняя криптография. Да мы получаем некоторое усложнение процесса (ящик пришлось пересылать три раза), но результат…

Вернемся к криптографии

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


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


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

Вернемся к математике

Идея с ящиком, о которой я описывал выше, вдохновили Диффи и Хеллмана искать способ передачи сообщения. В конце концов они пришли к использованию односторонних функций.

Что такое односторонняя функция? К примеру есть функция удвоение, т.е удвоить(4)=8 , она двухсторонняя, т.к. из результата 8 легко получить исходное значение 4. Односторонняя функция — та функция после применения которой практически невозможно получить исходное значение. К примеру смешивание желтой и синей краски — пример односторонней функции. Смешать их легко , а вот получить обратно исходные компоненты — невозможно . Одна из таких функций в математике — вычисление по модулю .

За основу алгоритма Хеллман предложил функцию Y x (mod P) . Обратное преобразование для такой функции очень сложно, и можно сказать что, по сути, заключается в полном переборе исходных значений.

К примеру вам сказали, что 5 x (mod 7) = 2 , попробуйте найдите x , а? Нашли? А теперь представьте что за Y и P взяты числа порядка 10 300 .

Кстати сказать, для повышения стойкости, число P должно являться простым числом, а Y — являться первообразным корнем по модулю P . Но так как мы все же пытаемся понять теорию, то смысла заморачиваться на этом я не вижу.

Алгоритм Диффи-Хеллмана

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

Алиса Боб
Этап 1 Оба участника договариваются о значениях Y и P для общей односторонней функции. Эта информация не является секретной. Допустим были выбраны значения 7 и 11 . Общая функция будет выглядеть следующим образом: 7 x (mod 11)
Этап 2 Алиса выбирает случайное число, например 3 A Боб выбирает случайное число, например 6 , хранит его в секрете, обозначим его как число B
Этап 3 Алиса подставляет число A 7 3 (mod 11) = 343 (mod 11) = 2 a Боб подставляет число B в общую функцию и вычисляет результат 7 6 (mod 11) = 117649 (mod 11) = 4 , обозначает результат этого вычисления как число b
Этап 4 Алиса передает число a Бобу Боб передает число b Алисе
Этап 5 Алиса получает b от Боба, и вычисляет значение b A (mod 11) = 4 3 (mod 11) = 64 (mod 11) = 9 Боб получает a от Алисы, и вычисляет значение a B (mod 11) = 2 6 (mod 11) = 64 (mod 11) = 9
Этап 6 Оба участника в итоге получили число 9 . Это и будет являться ключом.

Магия? Не спорю, с первого взгляда непонятно. Но после вчитывания и вдумывания в эту таблицу становится понятно как это работает. Впрочем если понятно не стало, то пролистайте до конца главы, там я выложил поясняющее видео.

Причем обратите внимание, что для получения ключа в конечной формуле, любому человеку нужно иметь три значения:

  • Значения a и P , и секретное число Боба B
  • или значения b и P , и секретное число Алисы A

Но секретные числа по каналу не передаются! Еве не получится восстановить ключ, не имея чьего-нибудь секретного числа. Почему — я писал выше, данная функция является односторонней. Попробуйте решите уравнение 4 x (mod 11) = 2 y (mod 11) найдя x и y .

Чтобы было понятнее, как работает схема Хеллмана, представьте шифр, в котором в качестве ключа каким-то образом используется цвет:

Допустим вначале, что у всех, включая Алису, Боба и Еву, имеется трехлитровая банка, в которую налит один литр желтой краски. Если Алиса и Боб хотят договориться о секретном ключе, они добавляют в свои банки по одному литру своей собственной секретной краски.

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

И наконец, Алиса берет смесь Боба и подливает в нее один литр своей секретной краски, а Боб берет смесь Алисы и добавляет в нее один литр своей секретной краски. Краска в обеих банках теперь станет одного цвета, поскольку в каждой находится по одному литру желтой, фиолетовой и малиновой краски.

Именно этот цвет, полученный при добавлении дважды в банки красок, и будет использоваться как ключ. Алиса понятия не имеет, какую краску добавил Боб, а Боб также не представляет, какую краску налила Алиса, но оба они достигли одного и того же результата.

Между тем Ева в ярости. Даже если она и сумеет перехватить банки с промежуточным продуктом, ей не удастся определить конечный цвет, который и будет согласованным ключом. Ева может видеть цвет краски, полученной при перемешивании желтой краски и секретной краски Алисы в банке, отправленной Бобу, и она может видеть цвет краски, полученной при перемешивании желтой краски и секретной краски Боба в банке, отправленной Алисе, но чтобы найти ключ, ей, на самом деле, необходимо знать цвета исходных секретных красок Алисы и Боба. Однако, рассматривая банки с перемешанными красками, Ева не сможет определить секретные краски Алисы и Боба. Даже если она возьмет образец одной из смешанных красок, ей не удастся разделить ее на исходные краски, чтобы найти секретную, поскольку смешивание краски является односторонней функцией.

Все равно непонятно? Тогда смотрим видео:

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

Асимметричное шифрование

асимметричный алгоритм предполагает под собой наличие двух ключей — публичного и приватного. То есть сообщение шифруется публичным ключом, а расшифровывается приватным и ни как иначе. Собственно именно эту концепцию сформулировал Диффи.

В общем суть данного алгоритма заключается в том, что принимающая сторона перед приемкой сообщения генерирует пару ключей на основе алгоритма модульной арифметики (принцип такой же как и в алгоритме Диффи-Хеллмана), собственно приватный и публичный ключ. Отправитель перед отправкой получает публичный ключ и шифрует сообщение данным ключом, после чего данное сообщение можно расшифровать только приватным ключом, который хранится в секрете у принимающей стороны.


Если вернуться к аналогии с замками, то шифрование с открытым ключом можно представить себе следующим образом:

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

Можно провести и более глубокую аналогию.

Представьте, что Алиса проектирует замок и ключ. Она бдительно охраняет ключ, но при этом изготавливает тысячи дубликатов замков и рассылает их по почтовым отделениям по всему миру. Если Боб хочет послать сообщение, он кладет его в коробку, идет на местный почтамт, просит «замок Алисы» и запирает им коробку. Теперь уже ему не удастся открыть коробку, но когда коробку получит Алиса, она сможет открыть ее своим единственным ключом.

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

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

Заключение

Что же, надеюсь что, поняв как работает асимметричное шифрование изнутри, вы станете больше ему доверять и соответственно чаще пользоваться SSL =)

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

  1. tv

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

  2. Игорь

    Для чего нужна эта ахинея с открытыми ключами? Симметричные надёжней.
    Добрый день!
    Хороший сайт, понятно изложен материал, огромное спасибо автору. Попал сюда случайно в сентябре, когда искал информацию по практическому шифрованию.
    Пишу потому, что хочу спросить: Есть желающие узнать как найти числа для симметричного шифрования? Могу научить на пальцах как быстро проверить число Р на простоту (без поиска числа g) — но это вряд ли будет интересно. Самое интересное:
    Найти число Р любой длины и число g к нему. Никакие 2 в степени n плюс один (или минус один) при этом не использую. Естественно, это бесплатно. Есть даже сайт, где я выложил свою работу.

  • Уася Петровичъ

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

    Это не сработает, т.к. после действий 2 и 3 мы видим разницу, на которую изменилось число каждого из блоков, следовательно нам становится очевидно секретное число Боба и нам остается только перехватить сообщение после 4-го действия (т.е. уже без шифра Алисы) и воспользоваться уже известным нам числом Боба.

  • Евгений

    Огромное спасибо за статью!
    После прочтения почти все легло на свои полочки, обрело структуру, которую легко наращивать.
    Имея такую структуру легко генерировать правильные вопросы (полочка для атак MiTM, отдельное спасибо Михаилу:)).

    С точки зрения педагогики Вы сделали все идеально. Думаю Вы правы, что не добавили в эту статью атаки MiTM иначе был бы перегруз информационный.

    Видео прелестное, особенно учитывая его возраст.

    PS: использование метафор для объяснения «сложных» систем честно говоря трудно переоценить. Еще раз спасибо!

  • dbzix

    Из этой статьи я не уловил момент перехода от алгоритма Диффи-Хеллмана, где два абонента для получения секретного ключа обмениваются публичными данными и промежуточными результатами вычислений (в примере получилось целых 6 этапов) к тому этапу, где для шифрования используется некий публичный ключ, который затем дешифруется при помощи приватного (я здесь насчитываю всего 2 этапа передачи данных — отправка публичного ключа и отправка зашифрованного этим ключом сообщения).
    Т.е. я понимаю, что где-то между двумя этими объяснениями наверняка кроется много математики, и в итоге объяснение сводится к «это работает именно так, просто поверь». Но было бы наверное проще понять этот внезапный переход, если бы аналогию с красками распространили на объяснение сути шифрования публичным ключом с последующим дешифрованием приватным. А пока получается какое-то «Б работает потому-что А», в то время как между А и Б чёткой связи не прослеживается. По крайней мере для меня.
    Уважаемый автор, не будете ли вы так любезны пояснить мне сей мистический прыжок от А к Б? :) Спасибо!

  • Евгений

    Добрый день,

    Дано: есть формула Y^x (mod P).
    пример в статье основывается на формуле 7^x (mod 11)

    я взял для своего примера 4^x (mod 7)
    и у меня не получилось прийти к общему ключу.
    Вопрос: почему алгоритм в примере работает для 7^x (mod 11) и не работает для 4^x (mod 7)?

  • Jessi-jane
  • Андрей

    Спасибо, статья отличная!
    Только вот чуть не разобрался в алгоритме, в том, как высчитывать через модуль.
    Не подскажите, как высчитывать число В, если число А меньше модуля?
    Ну например:
    3(mod 13) = ?

    Я знаю, что если, например, нужно высчитать 625(mod 13), нужно 625/13, а потом наибольший возможный целый делитель (48) умножить на модуль (что здесь будет равняться 624), и наконец 625-624 = 1
    Числа 625 и 1 сравнимы по модулю 13, так как 624 делится на 13.
    Вот это я понимаю. А вот как быть если модуль больше числа а?

  • Yellow Horror

    1. Атака «человек посередине», это серьёзная проблема. Насколько я могу судить, в рамках одной только криптографии она в принципе не решается: если принять, что Ева способна перехватить и незаметно подменить ВСЕ данные, поступающие к Алисе или исходящие от неё по ЛЮБЫМ каналам связи, никакое шифрование не поможет. Как минимум один сертификат должен быть получен Алисой из абсолютно надёжного источника. Но в случае, если злоумышленник может только прослушивать канал связи, а не менять данные в нём, асимметричное шифрование вполне надёжно.
    2. Что касается возможности снимать один «слой шифра» из-под другого, этим свойством обладает банальная функция XOR, широко используемая в криптографии с древнейших времён по сей день. Не думаю, что её можно запатентовать:(

    1. Дмитрий Амиров Автор

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

      Что касается функиции XOR — ее сложно назвать шифром, т.к. им она по своей сути не является.

      1. Yellow Horror

        Да ладно? Погуглите про «Шифр Вернама». Это система передачи сообщений с абсолютной криптоустойчивостью. И основана она именно на XOR. Если оставить в стороне некоторые организационные сложности (создание истинно случайных ключей с равномерным распределением, сохранение тайны шифроблокнота в недружелюбном окружении и надёжное уничтожение использованных ключей), ничего проще и надёжнее человечество ещё не придумало.

      2. Yellow Horror

        Хотя, по здравом размышлении, я понял, что метод с двойным обратимым шифрованием не работает, если злоумышленник знает алгоритм шифрования. Рассмотрим на примере идеи Михаила:

        1. Разбиваем шифруемую информацию на блоки. Каждый блок представлен числом. Размер блока (кол-во бит) определяет кол-во возможных значений блока и (соответственно?) стойкость шифрования.
        2. Алиса для шифрования сообщения выбирает секретное число (которое никому не отправляет), которое прибавляет к каждому из чисел в блоках и отправляет зашифрованное таким образом сообщение Бобу.

        Пока всё в порядке: Ева не может прочесть сообщение Алисы, т.к. не знает число-ключ. Если блоки достаточно велики, восстановить сообщение Алисы сложно, а если блок длиннее сообщения и ключ не имеет уязвимостей — невозможно. Но Ева может скопировать шифрограмму Алисы и делает это.

        3. Боб принимает зашифрованное сообщение, выбирает своё секретное число (которое также никому не отправляет), прибавляет это число к каждому из чисел в блоках зашифрованного Алисой сообщения и отправляет это двукратно зашифрованное сообщение Алисе.

        А вот тут уже начинаются проблемы: Ева всё ещё не может прочесть сообщение Алисы, но, располагая копией полученной Бобом шифрограммы и отправленной им двойной шифровкой, без проблем восстанавливает ключ Боба.

        4. Алиса вычитает своё секретное число из каждого числа в блоках этого двукратно зашифрованного сообщения и отправляет получившееся сообщение Бобу.

        Алиса сняла свой «слой» шифра и теперь пересылает Бобу своё письмо, зашифрованное только ключом Боба. Который у Евы уже есть! Ева расшифровывает письмо и читает его, а также на всякий случай может восстановить ключ Алисы, пользуясь расшифрованным текстом письма и первой перехваченной ею шифрограммой.

  • Dmitriy

    Здравствуйте. Хорошая статья, но я тоже не понял некоторые моменты, которые описали выше.
    Именно переход от алгоритма получения секретного ключа обоими собеседниками (Алиса и Боб) (без их выкладывания в публичный доступ) к асимметричному шифрованию.
    У вас написано, что сообщение кодируется на стороне Алисы публичным ключем, полученным от Боба. Но если мы зашифруем публичным ключём, то Ева сможет легко его получить и сама расшифровать, верно?
    Ещё для меня осталось непонятным, как можно зашифровать публичным ключём и расшифровать только секретным на стороне Боба. То есть зашифровали словом «Дом» , а расшифровали словом «Мир» . Для меня это какая-то несуразица.
    Исходя из этих очевидных пробелов (или у вас, или у меня) , я сделал вывод, что тут схема должна быть посложнее, чем на картинке. Скорее всего под стрелочкой от публичного ключа Боба к Алисе имеется в виду другое, а именно вся последовательность действий по получению «Y» и «P», получению промежуточных результатов и тд. Иными словами, я думаю, что при шифровке исходного сообщения якобы публичным ключем, на самом деле шифруется не публичным, а уже секретным, который вычисляется на каждой стороне по отдельности.

    Ещё у меня возник вопрос о расшифровки дважды зашифрованного сообщения. Если взять,допустим, шифр Цезаря, где каждая буква шифруется другой буквой, стоящей, скажем, на 3 позиции дальше. Если Алиса зашифрует букву А в сообщении буквой Б, а потом Боб зашифрует эту букву Б буквой Г, то получить букву А из Г будет просто, причём в любом порядке. Правда это скорее всего будет работать только в тех случаях, если оба знают тип шифрации собеседника и при достаточно простых типах шифрации (моноалфавитные/полиалфавитные). Я тоже новичок в криптографии, так что это моё имхо;)

    1. Dmitriy

      Забыл ещё спросить.
      В чём разница между симметричным и асимметричным способами?

      1. Dmitriy

        Я почитал, более менее как-то всё сгрупировал в уме.
        Отвечу на вопросы мною написаные, возможно, помогая тем самым другим читателям.
        1. По поводу

        У вас написано, что сообщение кодируется на стороне Алисы публичным ключем, полученным от Боба. Но если мы зашифруем публичным ключём, то Ева сможет легко его получить и сама расшифровать, верно?
        Ещё для меня осталось непонятным, как можно зашифровать публичным ключём и расшифровать только секретным на стороне Боба. То есть зашифровали словом «Дом» , а расшифровали словом «Мир» . Для меня это какая-то несуразица.

        В этой статье упомянут алгоритм RSA. Алгоритм симметричного шифрования. В нём действительно используется следующий алгоритм:
        1) Опираясь на некую одностороннюю функцию шифрования (функция, которую легко посчитать в одну сторону, но очень трудно в другую. А) мы создаём на получателе пару {открытый ключ;закрытый ключ}. Эта пара уникальна, то есть каждому открытому ключу соответствует уникальный закрытый ключ под эту одностороннюю функцию.

        3)Отправитель шифрует сообщение
        4)Передаёт получателю

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

        В чём разница между симметричным и асимметричным способами?
        Если я воспользовался алгоритмом Диффи и Хеллмана для передачи секретного ключа, а потом смог безопасно передать зашифрованное сообщение, то будет ли этот способ симметричным?

        Алгоритм Дэффи-Хелмана, который служит для обмена ключами и дальнейшим симметричным шифрованием . То есть его суть в том, что сначала оба получают полный ключ для шифрации и дешифрации и потом уже начинают самое обычное симметричное шифрование.

        Асимметричный способ — у одного узла есть вся информация для шифр./дешифр., а у другого, как правило, только для шифрации

        Симметричный — оба узла знают всю информацию для шифр./дешифр.

        Надеюсь, что кому-то помог;3

        1. Dmitriy

          В этой статье упомянут алгоритм RSA. Алгоритм Асимметричного шифрования Опечатался.

        2. Дмитрий Амиров Автор

          Гм… только сейчас заметил ваши комментарии. Приношу свои извинения.

          Все вроде верно. Есть одно но по вашему последнему абзацу, а конкретно термины:

          • Алгоритм Дэффи-Хелмана — является алгоритмом позволяющим получить один общий секретный ключ и не более того
          • Ассиметричное/симметричное шифрование — в целом у Вас все верно
          • RSA — алгоритм являющий собой совокупность этих вещей. На пальцах: с помощью ассимтричного шифрования по протоколу Деффи-Хелмена устанавливается секретный ключ с помощью которого уже методом симметричного шифрования шифруются сообщения между собеседниками.
        3. Дмитрий

          Я все равно не понял утверждение:
          2)Открытый ключ передаётся отправителю.
          3) Отправитель шифрует сообщение
          4)Передаёт получателю
          5)Получатель дешифрует с помощью закрытого ключа. Это сообщение нельзя дешифровать с помощью открытого ключа.

          Получается то, что Вы и мели ввиду с самого начала. Шифруем словом Дом, а дешифруем словом Мир. Означет ли это, что присутствует еще один алгоритм связующий Мир и Дом между собой?

  • Роберт

    Спасибо огромное!!!

  • Роман

    Спасибо. Решил наконец разобраться, как это работает и понял из этой статьи. Только, я считаю, если сообщники знают друг друга и есть возможность обменяться безопасно открытыми ключами, то так и стоит сделать. Чтобы исключить пагубное воздействие возможного появления человека посередине при обмене ключами, который будет прикидываться А как Б и Б как А подменяя ключи на свои и просматривая в итоге всю информацию.

    А в видео, думаю, зря они используют вот это вот 3^(24*54), т.к. вообще не очевидно откуда оно взялось, или пояснили бы, что это условно.

  • RinswinD

    Спасибо за статью. Всё очень доступно разъясняется.

  • grigory

    Ну раздражает ведь всех эта неграмотность правописания — «одностороняя» , «примененны», «длинна», как будто уж в 5-м классе. А так, неплохо для понимания основ.

  • grigory

    Бывает, что вопрос стоит просто. Вирусы-шифровальщики используют закрытый ключ. Есть оригинальный файл, есть файл зашифрованный. Задача: найти алгоритм, сказать так, который ищет алгоритм преобразования первого файла во второй…

  • Allexys

    Благодарю за понятную и нескучную статью! Наконец-то я врубился в основы:).

  • Ярослав

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

    Это не совсем так. приведу пример:
    — предположим что каждой букве соответствует цифровой код А = 1, Б = 2, В = 3 и т.д.;
    — предположим что Алиса отправляет Бобу письмо, состоящее из единственной буквы А (для упрощения примера);

    Алиса: накладывает свой шифр А + 2 = В

    Боб: накладывает свой шифр В + 3 = Е
    Боб: отправляет письмо Алисе
    Алиса: снимает свой шифр Е — 2 = Г
    Алиса: отправляет письмо Бобу
    Боб: снимает свой шифр Г — 3 = А

    Здесь число 2 — секретный ключ Алисы, 3 — секретный ключ Боба. Причем он может быть и не односимвольным. В принципе его длина ничем не ограничена.

  • Дмитрий

    Я долго обходил стороной теоретические основы ассиметричного шифрования. Знал поверхностно — есть открытый ключ, которым шифруются данные, и есть закрытый, которым эти данные дешифруются. Но меня всегда напрягала мысль о реализации подобного шифрования.
    Ваша статья во многом помогла, за это огромное вам спасибо!
    Только к ее концу я опять увидел эту несуразицу — «шифруется открытым ключом». Ведь, строго говоря, шифруется сообщение не открытым ключом, а ключом, полученным на основе закрытого ключа отправителя и открытого ключа получателя (который, в свою очередь, был сгенерирован на основе закрытого ключа получателя). Ведь в таблице про Алису и Боба — они и только они смогли получить один и тот же ключ «9» — он и используется для шифрации и дешифрации сообщения. А вот получить этот ключ можно только на основе пары ключей — секретного (Алисы/Боба) и публичного(Боба/Алисы).
    Образно — да, сообщение шифруется всегда секретным ключом отправителя (он, грубо говоря, постоянен) и публичным ключом получателя (он зависит от конкретного получателя), поэтому в описании шифрация «секретным» ключом опускается — и это опущение ломает всю стройность рассуждений.

  • кларксон

    прочел статью и не очень всеравно понял, хоть и лучше чем на вики. Но одно мне не понимается только. если ктот может ответить правильно — помогите.

    если я всем посылаю вопрос «сколько будет 2+2?», рассказываю как зашифровать ответ мне (рассказываю всем публичный ключ), и все мне направят ответ на вопрос, как я узнаю того, от кого именно я жду ответа, тобиш того с кем я хотел установить связь на самом деле?

    1. Дмитрий Амиров Автор

      Тут вы немного неправильно ставите вопрос.

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

      UPD: написал статью про , я думаю это будет правильный ответ на ваш вопрос.

      1. кларксон

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

        все же. зачем мне его публик ключ? скажите если я не правильно понимаю.
        я инициатор (мне нужны ответы, в примере я — принимающая сторона), значит генерирую пару. это ему, отвечающему (отправитель в вашем примере) нужен мой публик

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

  • Beshot

    Несколько раз перечитал эту статью и другие по теме, непонятен алгоритм использования ЭЦП в эл. документах. Если так как здесь: https://ru.wikipedia.org/wiki/Электронная_подпись , то возникают расхождения. Так все таки шифруем с помощью закрытого ключа или открытого?

    1. Дмитрий Амиров Автор

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

      Если подпись «расшифровалась», то значит публичный ключ соответствует закрытому, а т.к. закрытый ключ априори имеется только у отправителя, то значит подписал документ именно отправитель.

      1. Beshot

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

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

        1. Дмитрий Амиров Автор

          То есть сообщение шифруется публичным ключем, а расшифровывается приватным и ни как иначе.

          Не совсем верно. Сообщение шифруется одним ключом, а расшифровывается другим. Т.е. вполне можно зашифровать приватным, а расшифровать публичным.

          Давайте рассмотрим на примере. Вы хотите мне прислать сообщение, я хочу убедится что прислали его мне именно вы. Поэтапно:
          1) Вы шифруете сообщение закрытым ключом
          2) Присылаете его мне
          3) Я обращаюсь к вам, и получаю от вас Ваш публичный ключ
          4) Полученное сообщение расшифровываю Вашим публичным ключом
          5) Если сообщение расшифровалось — значит послали его именно вы

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

          1. Beshot

            Ок, но как быть если требуется скрыть от любопытных глаз сообщение?

  • Аня

    Добрый день! Статья понравилась, но остались вопросы (даже нашлась пара похожих в комментариях, но без ответов).
    Если во второй части статьи всеже перейти к аналогии с Алисой и Бобом, в частности к числам А, В, а, в, Р и к полученному в примере числу 9, что из них будет закрытым ключом, а что открытым? Заранее спасибо за ответ!

    1. Аня

      Не понятно, отправился мой комментарий или нет:(

    2. Дмитрий Амиров Автор

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

  • Григорий
  • Средства криптографической защиты гостайны до сих пор приравниваются к оружию. Очень немногие страны мира имеют свои криптографические компании, которые делают действительно хорошие средства защиты информации. Даже во многих развитых странах нет такой возможности: там отсутствует школа, которая позволяла бы эти технологии поддерживать и развивать. Россия одна из немногих стран мира, – может быть таких стран пять, или около того, – где все это развито. Причем и в коммерческом, и в государственном секторе есть компании и организации, которые сохранили преемственность школы криптографии с тех времен, когда она только зарождалась.

    Алгоритмы шифрования

    На сегодняшний день существует масса алгоритмов шифрования, имеющих значительную стойкость перед криптоанализом (криптографическую стойкость). Принято деление алгоритмов шифрования на три группы:

    • Симметричные алгоритмы
    • Ассиметричные алгоритмы
    • Алгоритмы хэш-функций

    Симметричные алгоритмы

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

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

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

    Где где М - открытый текст, К - секретный ключ, передаваемый по закрытому каналу, Еn(М) - операция зашифрования, а Dk(M) - операция расшифрования

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

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

    Симметричные системы имеют как свои преимущества, так и недостатки перед асимметричными.

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

    Примеры симметричных шифров

    • ГОСТ 28147-89 - отечественный стандарт шифрования
    • 3DES (Triple-DES, тройной DES)
    • RC6 (Шифр Ривеста)
    • Twofish
    • SEED - корейский стандарт шифрования
    • Camellia – японский стандарт шифрования
    • CAST (по инициалам разработчиков Carlisle Adams и Stafford Tavares)
    • XTEA - наиболее простой в реализации алгоритм
    • AES – американский стандарт шифрования
    • DES – стандарт шифрования данных в США до AES

    Асимметричные алгоритмы

    Ассиметричные системы также называют криптосистемами с открытым ключом. Это такой способ шифрования данных, при котором открытый ключ передается по открытому каналу (не скрывается) и используется для проверки электронной подписи и для шифрования данных. Для дешифровки же и создания электронной подписи используется второй ключ, секретный.

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

    Принцип работы асимметричных систем

    Допустим, имеются два абонента: А и В, и абонент В хочет отправить шифрованное сообщение абоненту А. Он зашифровывает сообщение с помощью открытого ключа и передает его уже зашифрованным по открытому каналу связи. Получив сообщение, абонент А подвергает его расшифрованию с помощью секретного ключа и читает.

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

    Примеры асимметричных шрифтов

    • RSA (Rivest-Shamir-Adleman, Ривест - Шамир - Адлеман)
    • DSA (Digital Signature Algorithm)
    • Elgamal (Шифросистема Эль-Гамаля)
    • Diffie-Hellman (Обмен ключами Диффи - Хелмана)
    • ECC (Elliptic Curve Cryptography, криптография эллиптической кривой)

    Хеш-функции

    Хешированием (от англ. hash) называется преобразование исходного информационного массива произвольной длины в битовую строку фиксированной длины.

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

    Нас интересуют криптографически стойкие хеш-функции. К таким обычно предъявляют два требования:

    • Для заданного сообщения С практически невозможно подобрать другое сообщение С" с таким же хешем
    • Практически невозможно подобрать пар сообщений (СС"), имеющих одинаковый хеш.

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

    Примеры хеш-алгоритмов

    • Adler-32
    • SHA-1
    • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)
    • HAVAL
    • N-Hash
      • RIPEMD-160
    • RIPEMD-256
    • RIPEMD-320
    • Skein
    • Snefru
    • Tiger (TTH)
    • Whirlpool
    • ГОСТ Р34.11-94 (ГОСТ 34.311-95)
    • IP Internet Checksum (RFC 1071)

    Криптографические примитивы

    Для придания зашифрованной информации большей криптографической стойкости, в криптографической системе могут многократно применяться относительно простые преобразования – примитивы. В качестве примитивов могут использоваться подстановки, перестановки, циклический сдвиг или гаммирование.

    Квантовая криптография

    Криптография в цифровых технологиях

    История

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

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

    В древние времена шифрование применялось главным образом в военном и торговом деле, шпионаже, среди контрабандистов.

    Несколько позже ученые-историки определяют дату появления другой родственной науки – стеганография. Эта наука занимается маскировкой самого факта передачи сообщения. Зародилась она в античности, а примером здесь может служить получение спартанским царем Леонидом перед битвой с персами провощенной дощечки с текстом, покрытой сухим легкосмываемым раствором. При очистке оставленные на воске стилусом знаки становились отчетливо видимыми. Сегодня для сокрытия сообщения служат симпатические чернила, микроточки, микропленки и т.д.

    С развитием математики стали появляться математические алгоритмы шифрования, но все эти виды криптографической защиты информации сохраняли в разной объемной степени статистические данные и оставались уязвимыми. Уязвимость стала особенно ощутима с изобретением частотного анализа, который был разработан в IX веке нашей эры предположительно арабским энциклопедистом ал-Кинди. И только в XV веке, после изобретения полиалфавитных шрифтов Леоном Баттистой Альберти (предположительно), защита перешла на качественно новый уровень. Однако в середине XVII века Чарлз Бэббидж представил убедительные доказательства частичной уязвимости полиалфавитных шрифтов перед частотным анализом.

    Развитие механики позволило создавать приборы и механизмы, облегчающие шифрование – появились такие устройства, как квадратная доска Тритемиуса, дисковый шифр Томаса Джефферсона. Но все эти приборы ри в какое сравнение не идут с теми, были созданы в XX веке. Именно в это время стали появляться различные шифровальные машины и механизмы высокой сложности, например, роторные машины, самой известной из которых является «Энигма »

    До бурного развития науки в XX веке криптографам приходилось иметь дело только с лингвистическими объектами, а в ХХ веке открылись возможности применения различных математических методов и теорий, статистики, комбинаторики, теории чисел и абстракной алгебры.

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

    Сегодня можно говорить о значительных разработках в квантовой криптографии.

    Литература

    • Баричев С.Г., Гончаров В.В., Серов Р.Е. Основы современной криптографии. - М.: *Варфоломеев А. А., Жуков А. Е., Пудовкина М. А. Поточные криптосистемы. Основные свойства и методы анализа стойкости. М.: ПАИМС, 2000.
    • Ященко В. В. Введение в криптографию. СПб.: Питер, 2001. .
    • ГОСТ 28147-89. Системы обработки информации. Защита криптографическая. Алгоритм криптографического преобразования. М.: ГК СССР по стандартам, 1989.
    • ГОСТ Р 34.10-94.Информационная технология. Криптографическая защита информации. *ГОСТ Р 34.11-94. Информационная технология. Криптографическая защита информации. Функция хэширования. М., 1995.
    • ГОСТ Р 34.10-2001 Информационная технология. Криптографическая защита информации. Процессы формирования и проверки электронной цифровой подписи. М., 2001.
    • Нечаев В. И. Элементы криптографии (Основы теории защиты информации). М.: Высшая школа, 1999.
    • Жельников В. Криптография от папируса до компьютера. М.: АВР,1996.

    Алгоритма должен сохраняться в секрете обеими сторонами. Алгоритм шифрования выбирается сторонами до начала обмена сообщениями.

    Секретная связь на основе симметричной криптосистемы.

    Для организации секретной связи традиционно используются симметричные шифрсистемы. «Штатными» Действующими лицами таких протоколов секретной связи являются отправитель, адресат и посредник, обеспечивающий пользователей ключами. Для рассмотрения вопросов защиты информации следует добавить в этот список «нештатных» участников: пассивного и активного нарушителя. Задача протокола – передать секретное сообщение x от отправителя адресату. Последовательность действий выглядит следующим образом:
    1. Отправитель и адресат договариваются об используемой симметричной шифрсистеме, т.е. о семействе отображений E = {}, kK.
    2. Отправитель и адресат договариваются о секретном ключе связи k, т.е. об используемом отображении E.
    3. Отправитель шифрует открытый текст x с помощью отображения , т.е. создаёт криптограмму y = (x).
    4. Криптограмма y передаётся по линии связи адресату.
    5. Адресат расшифровывает криптограмму y используя тот же ключ k и отображение ^(-1), обратное к отображению Ek и читает сообщение x= ^(-1)(y).
    Шаг 2 протокола реализуется с помощью посредника, третьей стороны, которую условно можно назвать центром генерации и распределения ключей (ЦГРК) (некоторые протоколы секретной связи на основе асимметричных шифрсистем не использую посредника, в них функции ЦГРК выполняются пользователями).
    Существенной особенностью протокола является секретность ключа k который передается отправителю и адресату либо в открытом виде по каналу связи, защищённому от действий криптоаналитика, либо в шифрованном виде по открытому каналу связи. Защищённый канал может иметь относительно невысокую пропускную способность, но должен надёжно защищать ключевую информацию от несанкционированного доступа. Ключ k должен оставаться в секрете до, во время и после реализации протокола, иначе нарушитель, завладев ключом, может расшифровать криптограмму и прочитать сообщение. Отправитель и адресат могут выполнить шаг 1 протокола публично (секретность шифрсистемы необязательна), но шаг 2 они должны выполнить секретно (секретность ключа обязательна).
    Такая необходимость вызвана тем, что линии связи, в особенности протяжённые, уязвимы с точки зрения вмешательства пассивного и активного нарушителей. Пассивный нарушитель (криптоаналитик), желая получить доступ к сообщению x, контролирует линию связи на шаге 4 протокола. Не вмешиваясь в реализацию протокола, он перехватывает криптограмму y с целью раскрытия шифра.

    Криптоанализ симметричной криптосистемы.

    Разрабатывая шифрсистему, криптограф обычно исходит из следующих предположений о возможностях криптоаналитика:
    1. Криптоаналитик контролирует линию связи.
    2. Криптоаналитику известно устройство семейства E отображений шифра.
    3. Криптоаналитику неизвестен ключ k, т.е. неизвестно отображение , использованное для получения криптограммы y.
    В этих условиях криптоаналитик пытается решить следующие задачи, называемые задачами дешифрования.
    1. Определить открытый текст x и использованный ключ k по перехваченной криптограмме y, т.е. построить такой алгоритм дешифрования , при котором (y)=(x,k). Данная постановка задачи предполагает использование криптоаналитиком статистических свойств открытого текста.
    2. Определить использованный ключ k по известному открытому и шифрованному текстам, т.е. построить такой алгоритм дешифрования , при котором (x,y)=k. Такая постановка задачи имеет смысл, когда криптоаналитик перехватил несколько криптограмм, полученных с использование ключа k, и располагает открытыми текстами не для всех перехваченных криптограмм. В этом случае, решив задачу дешифрования второго типа, он «прочтёт» все открытые тексты, зашифрованные с использованием ключа k.
    3. Определить используемый ключ k по специально подобранному открытому тексту x и соответствующему шифрованному тексту y, т.е. построить алгоритм дешифрования x такой, что x(y)=k. Подобная постановка задачи возникает тогда, когда криптоаналитик имеет возможность тестирования криптосистемы, т.е. генерирования криптограммы для специально подобранного открытого текста. Чаще такая постановка задачи возникает при анализе асимметричных систем. имеется разновидность этой задачи дешифрования, когда используется специально подобранный шифртекст.
    Для решения задач дешифрования криптоаналитик использует или шифрованное сообщение y, или пару (x,y), состоящую из открытого и шифрованного сообщений, или комплект таких сообщений или пар сообщений. Эти сообщения или комплекты сообщений называют шифрматериалом. Используемым для дешифрования количеством шифрматериала называется длина этих сообщений или суммерная длина комплекта сообщений. Количество шифрматериала является важной характеристикой метода дешифрования. Расстоянием единственности шифра называется наименьшее число знаков шифрованного текста, необходимых для однозначного определения ключа. Во многих практических случаях оно равно длине ключа, если ключ и криптограмма суть слова из равномощных алфавитов. При одинаковом количестве шифрматериала дешифровальные задачи первого типа отличаются более высокой вычислительной сложностью по сравнению с задачами второго и третьего типа, наименьшую вычислительную сложность имеют задачи тестирования.
    В ряде случаев криптоаналитик может решить задачу восстановления семейства E отображений шифра по известной паре (x,y) открытого и шифрованного текстов, пользуясь некоторыми дополнительными условаиями. Эта задача может быть сформулирована как «дешифровка чёрного ящика» по известным входам и соответствующим выходам.
    Активный нарушитель нарушает реализацию протокола. Он может прервать связь на шаге 4, полагая, что отправитель не сможет больше ничего сообщить адресату. Он может также перехватить сообщение и заменить его своим собственным. Если бы активный нарушитель узнал ключ (контролируя шаг 2 или проникнув в криптосистему), он мог бы зашифровать своё сообщение и отправить его адресату вместо перехваченного сообщения, что не вызвало бы у последнего никаких подозрений. Не зная ключа, активный нарушитель может создать лишь случайную криптограмму, которая после расшифрования предстанет случайной последовательностью.

    Требования к протоколу.

    Рассмотренный протокол подразумевает доверие отправителя, адресата и третьей стороны в лице ЦГРК. Это является слабостью данного протокола. Впрочем, абсолютных гарантий безупречности того или иного протокола не существует, так как выполнение любого протокола связано с участием людей и зависит, в частности, от квалификации и надёжности персонала. Таки образом, по организации секретной связи с использованием симметричной криптосистемы можно сделать следующие выводы.
    1. Протокол должен защищать открытый текст и ключ от несанкционированного доступа постороннего лица на всех этапах передачи информации от источника к получателю сообщений. Секретность ключа более важна, чем секретность нескольких сообщений, шифруемых на этом ключе. Если ключ скомпрометирован (украден, угадан, раскрыт, выкуплен), то нарушитель, имеющий ключ, может расшифровать все зашифрованные на этом ключе сообщения. Кроме того, нарушитель сможет имитировать одну из переговаривающихся сторон и генерировать фальшивые сообщения с целью ввести в заблуждение другую сторону. При частой смене ключей эта проблема сводится к минимуму.
    2. Протокол не должен допускать выхода в линию связи «лишней» информации, предоставляющей криптоаналитику противника дополнительные возможности дешифрования криптограмм. Протокол должен защищать информацию не только от посторонних лиц, но и от взаимного обмана действующих лиц протокола.
    3. Если допустить, что каждая пара пользователей сети связи использует отдельный ключ, то число необходимых ключей равно n*(n-1)/2 для n пользователей. Это означает, что при большом n генерация, хранение и распределение ключей становится трудоёмкой проблемой.

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

    Рис. 4.3. Система симметричной криптосистемы шифрования

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

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

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

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



    Симметричное шифрование идеально подходит для шифрования информации «для себя», например с целью предотвратить несанкционированный доступ к ней в отсутствие владельца. Это может быть как архивное шифрование выбранных файлов, так и прозрачное (автоматическое) шифрование целых логических или физических дисков.

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

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

    Существуют реализации алгоритмов симметричного шифрования для абонентского шифрования данных – то есть для отправки шифрованной информации абоненту, например, через Интернет. Использование одного ключа для всех абонентов подобной криптографической сети недопустимо по соображениям безопасности. Действительно, в случае компрометации (утери, хищения) ключа под угрозой будет находиться документооборот всех абонентов. В этом случае может быть использована матрица ключей (рис. 4.4).

    Матрица ключей представляет собой таблицу, содержащую ключи парной связи абонентов. Каждый элемент таблицы предназначен для связи абонентов i и j и доступен только двум данным абонентам. Соответственно, для всех элементов матрицы ключей соблюдается равенство

    . (4.3)

    Рис.4.4. Матрица ключей

    Каждая i -я строка матрицы представляет собой набор ключей конкретного абонента i для связи с остальными N - 1 абонентами. Наборы ключей (сетевые наборы) распределяются между всеми абонентами криптографической сети. Аналогично сказанному выше, сетевые наборы должны распределяться по защищенным каналам связи или из рук в руки.



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

    где М – исходный (открытый) блок данных; С – зашифрованный блок данных.

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

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

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

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

    Для получения стойких блочных шифров использовать два общих принципа:

    ¨ рассеивание – собой распространение влияния одного знака откры­того текста на много знаков шифртекста, что позволяет скрыть статистические свойства открытого текста.

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

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

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

    В составных шифрах в качестве простых шифров чаще всего используются простые перестановки и подстановки. При перестановке просто перемешивают символы открытого текста, причем конкретный вид перемешивания определяется секретным ключом. При подстановке каждый символ открытого текста заменяют другим символом из того же алфавита, а конкретный вид подстановки также определяется секретным ключом. Следует заметить, что в современном блочном шифре блоки открытого текста и шифртекста представляют собой двоичные последовательности обычно длиной 64 или 128 бит. При длине 64 бит каждый блок может принимать 2 64 значений. Поэтому подстановки выполняются в очень большом алфавите, содержащем до 2 64 ~ 10 19 «символов».

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

    Все действия, производимые блочным криптоалгоритмом над данными, основаны на том факте, что преобразуемый блок может быть представлен в виде целого неотрицательного числа из диапазона, соответствующего его разрядности. Например, 32-битный блок данных можно интерпретировать как число из диапазона 0...4294 967 295. Кроме того, блок, разрядность которого представляет собой «степень двойки», можно трактовать как сцепление нескольких независимых неотрицательных чисел из меньшего диапазона (указанный выше 32-битный блок можно также представить в виде сцепления двух независимых 16-битных чисел из диапазона 0...65 535 или в виде сцепления четырех независимых 8-битных чисел из диапазона 0...255).

    Над этими числами блочный криптоалгоритм производит по определенной схеме действия, перечисленные в табл. 4.1.

    Таблица 4.1. Действия, выполняемые криптоалгоритмами над числами

    В качестве параметра V для любого из этих преобразований может использоваться:

    ¨ фиксированное число (например, X "= X + 125);

    ¨ число, получаемое из ключа (например, X "= X + F(K ));

    ¨ число, получаемое из независимой части блока (например, Х 2" = Х 2 + F (Х 1)).

    Последовательность выполняемых над блоком операций, комбинации перечисленных выше вариантов V и сами функции F и составляют отличительные особенности конкретного симметричного блочного криптоалгоритма.

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

    13 июня 2017 в 13:37

    Симметричное и асимметричное шифрование. Разбор алгоритма передачи шифрованных данных между серверами

    • Алгоритмы ,
    • Информационная безопасность ,
    • Криптография

    Условимся, что машина, которая передает шифрованные данные - это всегда машина A, а машина, которая их принимает - имеет условное обозначение B.

    Библиотека решает два возможных случая (при необходимости довнесу функционал):


    2) Случай, когда имеется машина и ей необходимо передать шифрованные данные на другую машину (B). В этом случае инициатором передачи является первая машина (А).

    Библиотека реализует оба варианта, под каждый из которых есть демо:

    Для первого случая в папке server_b_1 есть скрипт testGetDataFromA.php
    Для второго случая в папке server_a_1 есть скрипт testPushDataToB.php

    Библиотека для обоих случаев одна и та же Encode.php, но для первого случая требуются одни дополнительные скрипты, для второго случая другие, поэтому во избежании путаницы я разнес их функционально на папку server_a_1 и server_b_1 (возможно последующие версии библиотеки будут иметь другую структуру). Таким образом если для обоих машинах необходима реализация и первого случая передачи и второго - каждая такая машина будет иметь у себя обе папки.

    Теперь о том как реализованы оба решения:

    Суть обоих случаев сводится к тому, что машины обмениваются симметричным ключом для передачи шифрованного текста. Для этого обмена используется ассиметричное шифрование, а именно, одна из машин (X) генерирует пару ключей (публичный и приватный) и передает публичный ключ второй машине. Вторая машина генерирует симметричный ключ этим публичным ключом и возвращает первой, которая его расшифровывает своим приватным ключом. Отличие заключается в том кто является инициатором передачи - в случае если шифрованный текст нужно получить одна последовательность действий, если передать - другая. Рассмотренная библиотека так же делает дополнительные проверки, которые сводятся к тому, что вместе с шифрованным с помощью публичного ключа симметричного ключа передаются данные, которые знают только обе машины и которые можно менять раз в годик (или даже передавать в каждой транзакции если кто захочет поиграть с кодом).

    Перед началом разбора реализации укажу лишь, что шифрование симметричного ключа происходит с использованием php функций шифрования Mcrypt по следующей схеме:

    $encrypted_data = urlencode(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sinc_key, $notice_text, MCRYPT_MODE_ECB))); $test_decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256,$sinc_key, base64_decode(urldecode($encrypted_data)),MCRYPT_MODE_ECB));
    Работа с асимметричным шифрованием происходит с использованием php OpenSSL

    Итак:

    Рассмотрю сначала упрощенные схемы обоих, указанных в самом начале случаев передачи, а потом более детально.

    1) Случай, когда имеется машина (B), которой нужны данные от машины A (например, ей нужно получить толкен клиента) и эти данные должны быть получены безопасно. Т.е. инициатором передачи является машина B.

    Машина B генерирует пару ключей (приватный и публичный) и делает запрос на машину A, отослав публичный ключ (приватный оставив у себя). Машина А генерирует симметричный ключ, шифрует им требуемую к передаче секретную информацию N. После этого машина А возвращает зашифрованный публичным ключом симметричный ключ, а так же зашифрованную симметричным ключом секретную информацию N. Машина B расшифровывает данные своим приватным ключом. В расшифрованных данных она получает симметричный ключ и зашифрованные им данные. С помощью симметричного ключа она расшифровывает секретные данные.

    Нет гарантии, что машина A - именно наша машина, а не ФСБ-шника Анатолия. Поэтому реализация этого алгоритма библиотекой немного изменена подполнительной проверкой:

    (Демо скрипта - server_b_1/testGetDataFromA.php)

    На обоих машинах прописан секретный ключ SIGNATURE_KEY, который учавствует в дополнительной проверке. Машина B генерирует пару ключей (приватный и публичный), ключ текущей коннекции и делает запрос (http://.../server_a_1/getDataToB.php) на машину A, отослав ключ текущей коннекции и публичный ключ (приватный оставив у себя). Машина А генерирует симметричный ключ, шифрует им требуемую к передаче секретную информацию N. Также формируются допданные M, которые представляют собой md5 от строки содержащей SIGNATURE_KEY и ключ текущей коннекции. После этого машина А возвращает зашифрованную публичным ключом строку из симметричного ключа и допданных М, а так же зашифрованную симметричным ключом секретную информацию N. Машина B расшифровывает данные с симметричным ключом своим приватным ключом, генерирует строку, подданным М (поскольку вполне может вычислить md5 от строки содержащей SIGNATURE_KEY и ключ текущей коннекции). Если допданные совпадают (что является просто дополнительной проверкой для каждой транзакции, что машина A знает SIGNATURE_KEY, а следовательно - наша машина), машина В извлекает симметричный ключ с помощью которого она расшифровывает секретную информацию N.

    2)Случай, когда имеется машина и ей необходимо передать шифрованные данные на другую машину (B). В этом случае инициатором передачи является первая машина (А).

    Упрощенный алгоритм такой передачи сводится к следующему:

    Перед передачей на машину B машине A нужен публичный ключ машины B чтобы передать информацию. Для этого она (машина А) сначала делает запрос на получение публичного ключа машине B. После получения машина A генерирует симметричный ключ, шифруем им требуемую информацию и все это шифрует полученным публичным ключом. Данные передаются машине В, которая расшифровывает пакет своим приватным ключом и симметричным ключом расшифровывает данные.

    Нет гарантии, что мы получили публичный ключ от машины B, а не от ФСБ-шника Петрова. Поэтому реализация этого алгоритма библиотекой немного изменена дополнительными проверками:

    (Демо скрипта - server_a_1/testPushDataToB.php)

    На обоих машинах прописан секретный ключ SIGNATURE_KEY, который участвует в дополнительной проверке. Машина A, сгенерировав md5 от ключа текущей коннекции и SIGNATURE_KEY отправляет эти данные (вместе с незашифрованым ключом текущей коннекции) машине B (http://.../server_b_1/get_public_key.php), которая генерирует публичный ключ только если у нее получается такой же md5 от своего SIGNATURE_KEY и полученного ключа текущей коннекции. Это не решает вопроса, что публичный ключ будет получен именно от машины A, а не от машины ФСБ-шника Василия, но гарантирует машеине B, что она генерирует публичный ключ именно для машины A (хотя генерация публичного ключа - дело вообще говоря произвольное, но даже тут лучше перестраховаться). Вместе с публичным ключом генерируется md5 от SIGNATURE_KEY и вторым ключом текущей коннекции. Второй ключ текущей коннекции - произвольный хеш. Данные публичного ключа, второго ключа произвольной коннекции и указанный md5 возвращаются на машину A. Получив второй ключ произвольной коннекции машина A, зная SIGNATURE_KEY генерирует проверочный md5 и если он совпадает с тем, что машина получила - публичный ключ считается именно от машины B, а не от Василия.

    Далее машина A (тут уже схема аналогична первому случаю передачи данных) генерирует симметричный ключ и доп проверку, которая представляет собой md5 от SIGNATURE_KEY и ключа текущей коннекции. Эти данные шифруются публичным ключом от машины B. Далее данные вместе с ключом текущей коннекции отправляются на машину B (http://.../server_b_1/pushDataFromA.php), которая генерирует на основе полученного из этих данных ключа текущей коннекции и SIGNATURE_KEY md5, сверяет с полученным, что дает гарантию, что данные не от ФСБ-шника Николая. Если все в порядке и проверка пройдена - с помощью приватного ключа извлекается симметричный ключ, которым уже расшифровывается сообщение.

    Буду рад, если кому-то пригодится эта информация.



    Просмотров