LINUX.ORG.RU

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

 


0

1

Есть приложение, оно обменивается данными по сети (UDP), данные шифруются AES.

На сервере (упрощенно):

rawData = Serialize(Login, md5(pass), data);
data = AES(rawData, AES_password);
send (data)
Хочу применить асимметричную криптографию.
Насколько я понимаю, код должен быть таким:
clientPubKey = receivePubKey();
rawData = Serialize(Login, md5(pass), data);
dataCrypted = Crypt(rawData, clientPubKey, serverPrivateKey);
send(dataCrypted);


Верно?

★★★★

используй TLS или DTLS, не нужно изобретать свои велосипеды

Harald ★★★★★ ()

Верно?

Нет, правильно «асимметричная».

anonymous ()

Не совсем. Или даже «совсем не». Емнип, грамотно шифровать асимметричным алгоритмом только ключ для блочного шифра (в твоём случае). Всё остальное шифруется обычным алгоритмом. ИМХО, надо что то таки почитать прежде чем в полымя бросаться.

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 2)
Ответ на: комментарий от AndreyKl

Я ключ по сети не передаю. Ключ хранится в клиенте и в сервере в конфиге. Что почитать можно (не теорию, как алгоритмы работают, а что-то больше по практике)?

ymuv ★★★★ ()
Последнее исправление: ymuv (всего исправлений: 2)
Ответ на: комментарий от ymuv

Бог его знает, я не специалист. Я проходил для общей грамотности вот этот курс https://www.coursera.org/learn/crypto

ты расскажи, зачем тебе асимметричный алгоритм если ты ключ не передаёшь?

AndreyKl ★★★★★ ()
Ответ на: комментарий от ymuv

Я ключ по сети не передаю. Ключ хранится в клиенте и в сервере в конфиге.

А зачем тебе тогда асимметричная криптография?

peregrine ★★★★★ ()

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

TOXA ★★ ()

Ну во-первых с таким вопросом лучше идти в буквари по криптографии (или википедию хотя бы). Всё уже давно разжёвано.

В-вторых

UDP

он допускает повреждение данных и не имеет возможности их проверки. То бишь ты рискуешь потерять возможность расшифорвать все данные из-за 1 лишь битого пакета.

Hater ★★ ()
Ответ на: комментарий от Hater

он допускает повреждение данных и не имеет возможности их проверки

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

vodz ★★★★ ()
Ответ на: комментарий от Hater

Это упрощенно было. Более точно:

rawData = Serialize(Login, md5(pass), data);
data = AES(rawData, AES_password);
send (data, CRC(data))
И если CRC не сходится, клиент переспросит.

ymuv ★★★★ ()
Последнее исправление: ymuv (всего исправлений: 1)
Ответ на: комментарий от TOXA

TOXA
peregrine
AndreyKl
Согласен, в таком случае не нужен. Можно и имеет ли смысл использовать асимметричную криптографию для пересылки начального вектора для AES? Или его можно посылать не шифрованым?

ymuv ★★★★ ()
Последнее исправление: ymuv (всего исправлений: 1)
Ответ на: комментарий от ymuv

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

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

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

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 2)
Ответ на: комментарий от ymuv

Обычно RSA используется для аутентификации конечных точек обмена информацией, дальше используется вариация DH(ECDH) для создания безопасного канала обмена симметричными ключами. Посмотри как сделано в OpenVPN, там есть все перечисленное, и по UDP...

TOXA ★★ ()

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

invy ★★★★★ ()
Ответ на: комментарий от vodz

Вот потеря пакета - другое дело

Это ещё не всё. Пакеты могут приходит не в том порядке, в котором отправлены, или дублироваться.

no-such-file ★★★★★ ()
Ответ на: комментарий от no-such-file

У UDP с шифрацией полно применений, где восстановление пакетов только всё ухудшит - видео/голос/туннели.

vodz ★★★★ ()

Нет, не верно. Надо выработать общий ключ через DH + HMAC или еще что-то подобное, а затем его использовать для шифрования AES. Это самая простая схема, а если хочется правильно, то DTLS или сделать как в IKE.

rymis ★★ ()

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

anto215 ()
Ответ на: комментарий от Hater

он допускает повреждение данных и не имеет возможности их проверки

crc checksum в заголовке IP уже недостаточно?

kawaii_neko ★★★ ()
Ответ на: комментарий от ymuv

Сейчас у меня используется один и тот же ключ AES. Насколько это безопасно?

Это примерно как если бы все квартиры в подъезде можно было открыть одним ключом и при этом на каждом этаже хотя бы один из жильцов хранит запасной ключ под ковриком/в цветочном горшке etc (он же у тебя в открытом виде в бинарнике, достаточно поставить breakpoint на функцию из libcrypto, и вуаля — вся твоя секурность накрылась медным тазом).

kawaii_neko ★★★ ()
Последнее исправление: kawaii_neko (всего исправлений: 1)
Ответ на: комментарий от ymuv

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

ответ здесь http://security.stackexchange.com/questions/30170/after-how-much-data-encrypt...

люди говорят 250 миллионов терабайт для аес 256. Ну меняй раз в год, чтобы уж наверняка.

Если ты имел ввиду что то другое, задай вопрос точнее.

лучше слушай тех кто вон гост читал.

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от ymuv

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

rymis ★★ ()
Ответ на: комментарий от kawaii_neko

достаточно поставить breakpoint на функцию из libcrypto

Будем считать, что 3-е лицо не имеет доступа к запущенным бинарям.

он же у тебя в открытом виде в бинарнике

Он у меня в открытом виде в конфиг файле. )

ymuv ★★★★ ()
Последнее исправление: ymuv (всего исправлений: 1)

Судя по вопросу вам категорически нельзя использовать криптопримитивы. Криптография — вполне себе rocket science.

Следуйте советам признанных экспертов в криптографии и берите готовую библиотеку. libsodium, которую советовали выше, — оптимальный вариант. Другой вариант — взять openssl/libressl/mbedtls и воспользоваться dtls оттуда.

grossws ()
Ответ на: комментарий от ymuv

Насколько это безопасно?

Безопасно, пока его не стырили.

no-such-file ★★★★★ ()
Ответ на: комментарий от ymuv

Но вообще говоря, нафиг тебе все эти заморочки? Почему просто не завернуть трафик в ssh-тунель?

no-such-file ★★★★★ ()
Ответ на: комментарий от AndreyKl

Там блок 64 бита, поэтому считается, что надо менять. Подробнее можно в RFC драфте на GOST в TLS посмотреть.

rymis ★★ ()
Ответ на: комментарий от ymuv

Читай теорию. Про то как Алиса с Бобом общаются. И им Мэлори козни строит.

invy ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.