Есть два оппонента, которые обо всем изначально договорились. Мне надо написать программу, которая впоследствии будет у каждого из оппонентов на компьютере. Программ должна шифровать текст по стандарту шифрования ГОСТ-2015 (который последний самый), а далее, как мне написали, "один оппонент шифрует текст и отправляет его другому оппоненту, а потом отправляет ключ для расшифровки зашифрованного текста по протоколу (или алгоритму) Диффи-Хеллмана.
Суть моего вопроса, сразу обозначу, что первый оппонент это А, второй - Б. Начну и начала. А заходит в программу, вводит текст и программа зашифровывает его по ГОСТУ, на выходе: зашифрованный текст и ключ для расшифровки. И теперь непосредственно вопрос, что должно произойти дальше? Было бы круто, если бы вы раскидали дальнейший алгоритм по пунктам. Я скорее всего просто не до конца разобрался в механиках работы Диффи-Хеллмана, да и скорее всего ГОСТа.
Заранее всем спасибо! Было бы совсем круто, если бы кто-нибудь, кто разбирается и понял, что я написал вышел, написал бы скайп (или телеграмм и прочие мессенджеры), чтобы я потом, если потребуется, задал бы пару вопросов. Это было бы ващееее)
Для правильного вопроса надо знать половину ответа
отправляет ключ для расшифровки зашифрованного текста по протоколу (или алгоритму) Диффи-Хеллмана
Что-то в этой фразе не так. Алгоритм Диффи-Хеллмана позволяет двум сторонам согласовать ключ шифрования не передавая данных, по которым третья сторона могла бы этот ключ получить (кроме атаки MiTM).
Как правило, этим методом стороны в начале общения вырабатывают общий сессионный ключ, а затем используют его при обмене сообщениями.
Вы оба правы, я почти уверен, просто я не так себе представлял работу Диффи-Хеллмана.
"Обычно Диффи-Хеллман как раз и генерирует сессионный ключ, на котором будет зашифровано сообщение каким-нибудь блочным шифром, например, ГОСТ 2015"
>>
ну, допустим путем исполнения алгоритма, две стороны сгенерировали приватные ключи 'a' и 'b', и общий, тоже секретный, ключ 'c'. Получается, 'c' - сессионный ключ. А что значит фраза "на котором будет зашифровано сообщение ..." Просто, вроде как, есть алгоритм ГОСТ 2015, есть текст и программа. Программ шифрует текст и генерирует ключ для расшифровки, а тогда каким образом здесь будет участвовать сессионный ключ 'c' из Диффи-Хеллмана? Подскажи пожалуйста.
У меня просто картинка не складывается, чтобы она сложилась - надо реализовать таск, а чтобы реализовать таск, надо чтобы сложилась картинка...
benzoback: Как правило делается всё несколько по другому. Сторона А содединяется со стороной Б и заявляет о необходимости шифрования, отправляя своё значение A = ea mod p. Сторона Б принимает соединение и отправляет своё значение B = eb mod p. Затем каждая из сторон рассчитывает ключ K = Ab mod p = Ba mod p. Поскольку длина K может отличаться от длины ключа используемого шифра, то каждая сторона одинаковым преобразованием строит ключ шифрования на основе K. Затем каждая из сторон использует этот ключ для шифрования/дешифрования сообщений.
Алгоритм Диффи-Хеллмана в принципе не предназначен для односторонней отправки сообщения.
Вот обе стороны рассчитывают ключ K и на основе K генерируется свой (индивидуальный?) ключ для каждой стороны, которым потом каждый может шифровать и дешифровать текст. То есть у абонента A ключ a, у абонента B ключ b, и получается зашифровав текст P ключом a, этот текст P можно расшифровать ключом b?
benzoback: Нет. После обмена у каждой стороны образуется один и тот же ключ K. Тут работает целочисленная математика:
xy mod p = (x mod p)y, где x и y - натуральные, p - простое
Отсюда:
A = ea mod p
B = eb mod p
Ab mod p = (ea mod p)b = (ea)b mod p = eab mod p = K
Ba mod p = (eb mod p)a = (eb)a mod p = eab mod p = K
Дальше одним и тем же преобразованием каждая сторона из K получает один и тот же ключ шифрования.
А по ГОСТУ 2015 не подскажете, разве там можно генерировать ключ шифрования, относительно K? Что-то типа kuznechik(K), или там по-другому все работает?
benzoback: Там нужен 256-битный ключ. Как вы его получите из K - дело ваше. Современный Диффи-Хэллман, обычно использует 2048- или 4096-битные p (и, соответственно, K), но никто не мешает сделать и более слабую реализацию или просто брать часть от K.
Спасибо большое за помощь. Можете пожалуйста подтвердить финальную версию моего понимания задачи?
Есть два абонента, у них у каждого стоит мною написанная программа. Две стороны состыкуются, друг другу отправляя значения переменных А и В, потом каждый на своей стороне вычисляет значение общего секретного ключа К. На этом моменте с Диффи-Хеллманом покончено. Далее, программа каким-либо образом преобразует К в 256-битный ключ К', и алгоритм ГОСТ шифрует по этому ключу текст. Один из абонентов отправляет текст другому, другой расшифровывает его тем же ключом K'.
Всё, в детали обмена информацией между сторонами не вдаемся, это не важно.
benzoback: Да, как то так. Часто ещё перед отправкой A и B одна из сторон генерирует и отправляет другой e и p, которые обе стороны используют в вычислениях.
Обычно Диффи-Хеллман как раз и генерирует сессионный ключ, на котором будет зашифровано сообщение каким-нибудь блочным шифром, например, ГОСТ 2015.
Но если Вам принципиально, чтобы программа сначала сгенерировала случайный ключ и провела шифрование блочным алгоритмом, а только потом провела обмен по Диффи-Хеллману, то такое тоже возможно, хотя и несколько избыточно:
1) согласуйте по Диффи-Хеллману обычным порядком сессионный ключ;
2) зашифруйте этим ключ Ваш ключ блочного шифрования и отправьте по каналу абоненту Б.
Вы оба правы, я почти уверен, просто я не так себе представлял работу Диффи-Хеллмана.
"Обычно Диффи-Хеллман как раз и генерирует сессионный ключ, на котором будет зашифровано сообщение каким-нибудь блочным шифром, например, ГОСТ 2015"
>>
ну, допустим путем исполнения алгоритма, две стороны сгенерировали приватные ключи 'a' и 'b', и общий, тоже секретный, ключ 'c'. Получается, 'c' - сессионный ключ. А что значит фраза "на котором будет зашифровано сообщение ..." Просто, вроде как, есть алгоритм ГОСТ 2015, есть текст и программа. Программ шифрует текст и генерирует ключ для расшифровки, а тогда каким образом здесь будет участвовать сессионный ключ 'c' из Диффи-Хеллмана? Подскажи пожалуйста.
У меня просто картинка не складывается, чтобы она сложилась - надо реализовать таск, а чтобы реализовать таск, надо чтобы сложилась картинка...