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

Я хочу защитить свои данные от изменения или чтения посторонними лицами. Поискав вокруг, я обнаружил, что аутентифицированное шифрование (AE) является решением.
Я знаю, что могу выполнять AE в Crypto++, используя любой из CCM, GCM или EAX. Но я заметил, что они используют один и тот же ключ для шифрования и расшифровки данных. Я не хочу этого, я предпочитаю использовать асимметричные ключи для шифрования и дешифрования своих данных.
Если я подпишу данные с помощью асимметричного алгоритма, а затем зашифрую их с помощью симметричного алгоритма, я добьюсь того, чего хочу (что должно быть в безопасности, так как это метод AtE, верно?).
Но прежде чем я это сделаю , есть ли какие-нибудь криптобиблиотеки, которые уже делают то, что я хочу?


person atoMerz    schedule 23.11.2012    source источник
comment
Authenticate-Then-Encrypt имеет тенденцию быть проблематичным. Я бы предпочел подписать открытый текст, а затем зашифровать оба, используя аутентифицированное шифрование.   -  person CodesInChaos    schedule 23.11.2012
comment
Связанный crypto.stackexchange.com/questions/5458/   -  person CodesInChaos    schedule 23.11.2012
comment
@CodesInChaos, это то, что сначала пришло мне в голову, но не переусердствую ли я с тем, что мне нужно сделать?   -  person atoMerz    schedule 23.11.2012
comment
@owlstead Поправьте меня, если я ошибаюсь. RSA использует открытый ключ для шифрования данных, поэтому каждый должен иметь возможность создать ключ AES, зашифровать его с помощью RSA, выполнить GCM и отправить его Бобу. Боб подумал бы, что это действительное сообщение от Алисы, поскольку он может расшифровать ключ и использовать его с GCM для проверки отправленного сообщения.   -  person atoMerz    schedule 24.11.2012
comment
Но для подписи данных RSA использует закрытый ключ. Отсюда и возникла идея пения.   -  person atoMerz    schedule 24.11.2012
comment
@AtoMerZ: Правда, должно быть, спал или что-то в этом роде :) Я не должен публиковать сообщения в такие моменты.   -  person Maarten Bodewes    schedule 24.11.2012


Ответы (3)


Я знаю, что могу выполнить аутентифицированное шифрование... используя... CCM, GCM или EAX. Но я заметил, что они используют один и тот же ключ для шифрования и расшифровки данных. Я этого не хочу, я предпочитаю использовать асимметричные ключи для шифрования и расшифровки своих данных.

Все известные мне схемы будут использовать симметричный шифр для шифрования больших объемов данных. Симметричный шифр может быть блочным или поточным шифром.

Я также видел несколько некорректных приложений RSA, где RSA работает в режиме ECB. То есть данные «разбиваются» или «блокируются», а затем к каждому блоку применяется RSA. В Справочнике по прикладной криптографии содержится особое предупреждение об этом.

Лучшее, что вы, вероятно, собираетесь сделать, это Интегрированная схема шифрования на основе эллиптических кривых (ECIES) или Интегрированная система шифрования дискретных журналов (DLIES). Оба доступны в Crypto++. Оба используют криптографию с открытым ключом (асимметричную).

ECIES и DLIES объединяют механизм инкапсуляции ключей (KEM) с механизмом инкапсуляции данных (DEM). Система независимо получает симметричный ключ шифрования и ключ MAC из общего секрета. Данные сначала шифруются с использованием симметричного шифра, а затем зашифрованный текст подвергается MAC-адресации в соответствии со схемой аутентификации. Наконец, общий секрет шифруется общедоступной частью пары открытый/закрытый ключ. Результатом функции шифрования является кортеж {K,C,T}, где K — зашифрованный общий секрет, C — зашифрованный текст, а T — тег аутентификации.

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

KEM и DEM избегают заполнения, поэтому оракулы заполнения не являются проблемой. Вот почему KDF используется для обработки большого «общего секрета» KEM. Отсутствие заполнения значительно упрощает проверку безопасности системы. Из-за доказательств безопасности ECIES и DLIES являются IND-CCA2, что является одним из самое сильное, чего вы можете достичь.


Если я подпишу данные с помощью асимметричного алгоритма, а затем зашифрую их с помощью симметричного алгоритма...

Вот некоторые материалы по теме... Во-первых, это Порядок шифрования и аутентификации для защиты связи< /а>. Во-вторых, Дон Дэвис дефектная подпись и шифрование в S/MIME, PKCS#7, MOSS, PEM, PGP и XML.

Актуальность здесь заключается в следующем: статья Кравчика посвящена криптографии с симметричным ключом и стилю аутентифицированного шифрования «Зашифровать, затем аутентифицировать» (и тому, как выполнить аутентифицированное шифрование). Статья Дэвиса посвящена асимметричной криптографии и несоответствию между подписью и шифрованием (и тому, как это исправить).


Но прежде чем я это сделаю, есть ли какие-нибудь криптобиблиотеки, которые уже делают то, что я хочу?

Да (но это зависит от того, что вы хотите сделать). Насколько я знаю, Crypto++ — единственный, который предоставляет ECIES, DLIES и набор PSSR.

Bouncy Castle занимает второе место, поскольку предоставляет ECIES, но не DLIES. Я не уверен, сколько PSSR он предоставляет.

Crypto++, Bouncy Castle, OpenSSL (и другие) предоставляют PSSR. У вас не должно возникнуть проблем с поиском библиотеки с PSSR.

person jww    schedule 02.05.2015
comment
Спасибо за информацию, они обязательно пригодятся для дальнейшего использования. Что касается вопроса в конце вашего ответа, я должен сказать, что я немного знаком с концепциями шифрования, но я уверен, что даже близко не понимаю их. Поэтому я думаю, что первое предложение в моем вопросе должно более или менее неформально описать мои цели. - person atoMerz; 03.05.2015
comment
@atoMerz — в этом случае сгенерируйте пару ключей EC для пользователя. Зашифруйте файл под открытым ключом пользователя, используя ECIES. Трудно получить намного лучше, чем эта схема. В противном случае взгляните на Шифрование с проверкой подлинности на вики Crypto++. Недостатком AE является то, что вы должны выполнять управление ключами. - person jww; 03.05.2015

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

Есть несколько реализаций с открытым исходным кодом. BouncyCastle предлагает один, но я не уверен, что у них есть реализация C++.

person Duncan Jones    schedule 23.11.2012
comment
Я искал только BouncyCastle, но теперь, когда я заметил, что существуют и реализации C/C++, можете ли вы объяснить, как его использовать для моей цели? - person atoMerz; 25.11.2012
comment
Я думаю, что лучший способ — просто посмотреть, как приложение CLI выполняет шифрование и подпись, после прочтения протокола. - person Maarten Bodewes; 25.11.2012

GPGME (упрощенная версия GnuPG). Это библиотека шифрования высокого уровня на C, лицензированная LGPL.

person jbtule    schedule 26.11.2012
comment
Да, я нашел это. Знаете ли вы имя функции, которая делает то, что я ищу? - person atoMerz; 26.11.2012
comment
gpgme_op_encrypt_sign и gpgme_op_decrypt_verify - person jbtule; 26.11.2012
comment
Спасибо за ссылки. Однако я все еще не понимаю несколько моментов. В ваших ссылках указано encryp_sign, но на самой странице говорится только о шифровании. А во-вторых, как работает decrypt_verify? Я не вижу никаких ключей, переданных в него. - person atoMerz; 27.11.2012
comment
Прокрутите вниз, дальше для gpgme_op_encrypt_sign, и вам нужно будет прочитать остальную часть руководство для получения всей информации - person jbtule; 27.11.2012
comment
Спасибо, добавление комментариев как часть вашего ответа будет оценено. Это помогло бы и другим. - person atoMerz; 28.11.2012