Асиметрично удостоверено криптиране

Искам да защитя данните си от промяна или четене от неоторизирани хора. Търсейки наоколо, открих, че Authenticated Encryption (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 се прилага към всеки блок. Наръчник за приложна криптография изрично предупреждава срещу това.

Най-доброто, което вероятно ще направите, е Eliptic Curve Integrated Encryption Scheme (ECIES) или Интегрирана система за шифроване на дискретни регистрационни файлове (DLIES). И двете са налични в Crypto++. И двете използват криптография с публичен ключ (асиметрична).

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

Има известно размахване на ръката около „общата тайна“, тъй като тя всъщност е резултат от прилагане на функция за ключово споразумение и по-късно усвоена с KDF. Той използва статичен публичен ключ и двойка ефимерни ключове. Лицето, извършващо дешифрирането, използва публичния си ключ, за да извърши другата половина от обмена на ключове, за да стигне до „общата тайна“.

KEM и DEM избягват подплънките, така че подпълващите оракули не са проблем. Ето защо KDF се използва за усвояване на голямата „обща тайна“ под KEM. Пропускането на подложките значително опростява доказателствата за сигурност на системата. Поради доказателствата за сигурност ECIES и DLIES са IND-CCA2, което е едно от най-силното, което можете да постигнете.


Ако подпиша данни с помощта на асиметричен алгоритъм и след това ги криптирам с помощта на симетричен алгоритъм...

Ето малко свързано четиво... Първо е Редът за криптиране и удостоверяване за защита на комуникациите на Hugo Krawczyk /a>. Второто е Дефектно подписване и шифроване на Дон Дейвис в S/MIME, PKCS#7, MOSS, PEM, PGP и XML.

Уместността тук е: документът на Krawczyk се занимава с криптография със симетричен ключ и стила Encrypt-then-Authenticate на удостоверено криптиране (и как да се извърши удостоверено криптиране). Докладът на Дейвис се занимава с асиметрична криптография и липсата на връзка между подписване и криптиране (и как да го поправите).


Но преди да направя това, има ли крипто библиотеки, които вече правят това, което искам?

Да (но зависи какво искате да правите). Crypto++ е единственият, за който знам, че предоставя ECIES, DLIES и колекция от PSSR.

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

Crypto++, Bouncy Castle, OpenSSL (и други) предоставят PSSR. Не би трябвало да имате проблеми с намирането на lib с PSSR.

person jww    schedule 02.05.2015
comment
Благодаря за информацията, определено ще са полезни за по-късна употреба. Относно въпроса в края на вашия отговор, трябва да кажа, че съм някак запознат с концепциите за криптиране, но определено нямам дори близко до умерено разбиране за тях. Така че мисля, че първото изречение във въпроса ми трябва да описва целите ми по повече или по-малко неформален начин. - person atoMerz; 03.05.2015
comment
@atoMerz - В такъв случай генерирайте двойка EC ключове за потребителя. Шифровайте файла под публичния ключ на потребителя с помощта на ECIES. Трудно е да се получи много по-добро от тази схема. В противен случай разгледайте Authenticated Encryption в Crypto++ wiki. Недостатъкът на 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