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

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

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

Однако с подобным подходом возникает ряд проблем:

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


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

Поэтому перед криптографией стоит вопрос, как сохранить неприкосновенность информации даже при условии попадания «сейфа» в руки противника.

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

image
Примерно в таком виде оставляет вашу информацию шифрование, с тем лишь отличием, что она остается восстановимой при условии, если известен ключ

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

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

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

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

При симметричном шифровании используется следующий протокол передачи информации:

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

image

Учитывая, что длинна пароля у нас — 12 символов, а каждый символ — 8 битов, полный перебор займет у алисы (2^8)^(12), или 2^96 операций. Подобный перебор займет у злоумышленника несколько веков и вряд ли зашифрованная информация к этому времени сохранит актуальность.

Алиса на своем компьютере имеет простейшую программу

	public class User
	{
		private String password = "qdghjfTTfbfs4852";
                // SymmEncrypor - класс, отвечающий за симметричное шифрование
		private SymmEncryptor SE = new SymmEncryptor();

                // Метод для зашифровки сообщений
		private String encryptMessage(String message)
		{
			String encMessage = SE.encrypt(message, password);
			System.out.print("Зашифрованное сообщение: " + encMessage);
			return encMessage;
		}

                // Метод для расшифровки сообщений
		private String decryptMessage(String EncryptedMessage)
		{
			String encMessage = SE.decrypt(EncryptedMessage, password);
			System.out.print("Исходное сообщение: " + decMessage);
			return decMessage;
		}


		public static void main(String[] args)
		{
			String message = encryptMessage("Hello, Bob!");
		}
	}

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

Программа, установленная у Боба:

public class User
	{
		private String password = "qdghjfTTfbfs4852";
		private SymmEncryptor SE = new SymmEncryptor();

		private String encryptMessage(String message)
		{
			SymmEncryptor SE = new SymmEncryptor();
			String encMessage = SE.encrypt(message, password);
			System.out.print("Зашифрованное сообщение: " + encMessage);
			return encMessage;
		}

		private String decryptMessage(String message)
		{
			String encMessage = SE.decrypt(message, password);
			System.out.print("Исходное сообщение: " + decMessage);
			return decMessage;
		}
	

               public static void main(String[] args)
		{
	

			// сообщение, полученное Бобом через небезопасный прослушиваемый канал связи
			String message = "FJekjfisdf7f33fFFDf788dsfvUHVUDIUSiusdyf&D&F^8"
			
			// Боб дешифрует сообщение, полученное от Алисы, с помощью пароля qdghjfTTfbfs4852
			String DecryptedMessage = decryptMessage(message);
			
			* Вывод : Исходное сообщение: Hello, Bob!
		}
	}

Метод SymmEncryptor пока остается для нас черным ящиком, мы не знаем, как он работает, а лишь полагаемся на его надежность

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

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

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

Комментарии (22)


  1. Pro-invader
    28.02.2018 17:43

    В Java-стрингах не рекомендуют хранить пароли. Лучше в массиве.


    1. FragCounter
      01.03.2018 11:01

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


  1. Alexeyslav
    28.02.2018 18:13

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


    1. cuwHuk
      28.02.2018 19:26
      +1

      Недостаток симметричного шифра… то ключ ломается на раз-два… Поэтому метод шифрования как самостоятельный нынче не используется от слова совсем.

      AES, A5/1, A5/2, A5/3 — примеры симметричных шифров, используемых в сотовых системах связи. Ждём от вас утилиту, ломающую на раз-два AES-128 (т.е. вычисляющую ключ шифрования) при ПОЛНОСТЬЮ известном шифрсообщении, размер сообщения предлагаю взять любой удобный, например 1 Гбайт.

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


      1. jcmvbkbc
        28.02.2018 20:12

        Вы упустили вот этот важный момент из оригинального сообщения:

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

        Ждём от вас утилиту

        Для A5/1 — наслаждайтесь: srlabs.de/wp-content/uploads/2010/07/Attacking.Phone_.Privacy_Karsten.Nohl_1-1.pdf opensource.srlabs.de/projects/a51-decrypt


        1. cuwHuk
          01.03.2018 16:21

          Вы упустили вот этот важный момент

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

          Для A5/1 — наслаждайтесь

          В А5/1 и А5/2 есть уязвимости, это давно известно, я просил утилиту для AES-128.


      1. Googolplex
        28.02.2018 20:33

        Я подозреваю, что имелось в виду не шифросообщение (которое ciphertext), а открытое сообщение (которое plain text). Хотя и здесь тоже все зависит от алгоритма, насколько я понимаю.


        1. Ocelot
          01.03.2018 09:38
          +1

          Всё равно. Хороший симметричный шифр устойчив к атакам по открытому тексту (когда Еве известно и сообщение, и соответствующий шифротекст, надо найти ключ). И даже к атакам по произвольному открытому тексту (у Евы есть возможность самой придумать сообщение, пропустить через шифратор и посмотреть, что на выходе).
          Примеры — AES, Twofish, Serpent.


          1. Alexeyslav
            01.03.2018 14:56

            Именно что хороший алгоритм, а не самый простой. А так называемый хороший основан на том же простом алгоритме, который применяется таким образом чтобы противостоять атаке. Посмотреть в множество алгоритмов, в основе увидим всё тот же XOR…


            1. Ocelot
              01.03.2018 16:58

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


              1. jcmvbkbc
                01.03.2018 20:25
                +1

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

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


                1. cuwHuk
                  01.03.2018 22:10

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


      1. Alexeyslav
        01.03.2018 14:50

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


        1. cuwHuk
          01.03.2018 16:41

          Да, криптостойкость большинства современных симметричных алгоритмов шифрования основана на многораундовости (AES, KASUMI), но утверждение о низкой криптостойкости таких алгоритмов в общем случае неверное. Криптостойкость того же AES-128 на текущий момент оценивается в 2^126,5, была опубликована работа кого-то из авторов RSA о возможности взлома KASUMI (используется в 2G и 3G) при наличии нескольких гигабайт открытого текста, но о практической реализации такой атаки я ничего не слышал.


    1. MichaelKuznetsov
      01.03.2018 11:01

      Атака на основе открытых текстов. Даже старый DES прекрасно ей противостоит, требую 2 в 47 степени пар открытый текст/шифротекст для эффективной атаки. Что более чем много, и в нормальных условиях атака невозможна. Не говоря уже о более новых шифрах типа AES.


    1. Inanity
      01.03.2018 11:01

      Не вводите людей в заблуждение. Не спорю, что какой-нибудь плохой симметричный шифр может быть подвержен описанной вами атаке (кстати она называется Known-plaintext attack), но все современные симметричные шифры (как минимум финалисты конкурса AES) обязаны быть стойкими к следующим основным типам атак:

      1. Атака на основе шифротекста
      2. Атака на основе известного открытого текста
      3. Атака на основе подобранного открытого текста
      4. Атака на основе адаптивно подобранного открытого текста


  1. EugeneNuke
    01.03.2018 01:29

    А у вас в функции decryptMessage объявляется decMessage, а возвращается encMessage...


  1. Deosis
    01.03.2018 06:46

    Аналогия с сейфом применима


    1. "Болгарки" пока ни у кого нет.
    2. Схемы сейфов исследуются специалистами на наличие лазеек.


    1. VolCh
      01.03.2018 09:42

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


  1. chuikoffru
    01.03.2018 07:26

    Спасибо за доступный и наглядный язык изложения материала. Жду продолжения.


  1. Zhenika
    01.03.2018 08:38

    Интересное начало статей. Хорошо бы в данной статье добавить некое оглавление на следующие статьи.


  1. HenadziMatuts
    01.03.2018 17:06
    +1

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