RSA (Rivest–Shamir–Adleman) — асиметрична криптография и ключове
Научете RSA: как работи асиметричната криптография, публични и частни ключове, сигурност и факторизация. Практически обяснения и реални примери.
RSA (Rivest-Shamir-Adleman) е алгоритъм, използван от съвременните компютри за криптиране и декриптиране на съобщения. Това е асиметричен криптографски алгоритъм. Асиметричен означава, че има два различни ключа. Нарича се още криптография с публичен ключ, тъй като единият от ключовете може да бъде даден на всеки. Другият ключ трябва да се пази в тайна. Алгоритъмът се основава на факта, че намирането на множителите на голямо съставно число е трудно: когато множителите са прости числа, проблемът се нарича просто факторизиране. Той също така е генератор на двойка ключове (публичен и частен ключ).
RSA включва публичен ключ и частен ключ. Публичният ключ може да бъде известен на всеки - той се използва за криптиране на съобщения. Съобщенията, криптирани с публичния ключ, могат да бъдат декриптирани само с частния ключ. Частният ключ трябва да се пази в тайна. Изчисляването на частния ключ от публичния ключ е много трудно.
Как работи RSA — основни стъпки
- Генериране на ключове:
- Избират се две големи случайни прости числа p и q.
- Изчислява се n = p · q — това е модулът, използван в публичния и частния ключ.
- Изчислява се φ(n) = (p − 1)(q − 1) (Ейлеровата функция).
- Избира се броят e (обществен експонент), такъв че 1 < e < φ(n) и gcd(e, φ(n)) = 1 (често използвани стойности са 65537 или 3).
- Намира се d — обратният елемент на e по модул φ(n), т.е. d · e ≡ 1 (mod φ(n)).
- Публичният ключ е (n, e); частният ключ е (n, d). p и q трябва да се пазят в тайна или да бъдат унищожени след изчисляване на d.
- Криптиране и декриптиране:
- Криптиране: за съобщение m (0 ≤ m < n) се изчислява c = m^e mod n.
- Декриптиране: с частния ключ се възстановява m = c^d mod n.
- Подписи: За цифров подпис се изчислява s = h(m)^d mod n, където h(m) е хеш на съобщението. Проверка: h(m) ≡ s^e mod n.
Практически аспекти и защо е необходим padding
- В чистата си форма RSA е детерминистичен — същият текст дава един и същ шифротекст, което позволява атаки. Затова в реални протоколи се използват схеми за запълване (padding) като PKCS#1 v1.5 или съвременния OAEP (Optimal Asymmetric Encryption Padding), които осигуряват семантична сигурност.
- При подписване се използват стандарти като RSASSA-PSS, които включват безопасни методи за хеширане и padding.
Сигурност и атаки
- Основната математическа трудност е факторизацията на n = p·q. Ако нападател намери p и q, може да пресметне φ(n) и да възстанови d от e.
- Типични практически атаки:
- атаките чрез факторизация (GNFS — General Number Field Sieve е най-ефективният алгоритъм за големи числа),
- странични канали (timing, power analysis) при имплементации,
- атаки по избрана шифротекст (chosen-ciphertext) при липса на правилен padding,
- атаки при лошо генерирани или недостатъчно големи ключове.
Размери на ключовете и препоръки
- Минимално препоръчителен размер за RSA ключ към 2025 г. е 2048 бита за обща употреба. За по-дълготрайна защита (например повече от 10–15 години) се използват 3072 или 4096 бита.
- По-големите ключове дават по-висока сигурност, но значително по-голямо изчислително натоварване — RSA е бавен за големи съобщения, затова често се използва за сигурно разменяне на симетрични ключове (където самото съдържание е криптирано с бързи симетрични алгоритми като AES).
- Добри практики: използвайте стандартизирани библиотеки, надеждни генератори на случайни числа, защитени хардуерни модули (HSM) за хранене на частни ключове и правилни схеми за padding.
Приложения
- SSL/TLS (за установяване на сигурни връзки),
- PGP/SMIME за електронна поща,
- криптиране на малки данни и предаване на симетрични ключове,
- цифрови подписи и удостоверяване (аутентификация).
Бъдеще — квантови компютри
- Квантовите алгоритми (особено Shor's algorithm) биха могли да факторизират големи числа много по-бързо от класическите методи, което прави RSA уязвим при наличието на достатъчно мощни квантови компютри.
- Затова за дългосрочна защита се развиват постквантови (post-quantum) криптографски алгоритми и хибридни протоколи, които комбинират класическата RSA/ECC защита с постквантови решения.
Кратки съвети за практическа употреба
- Използвайте актуални криптографски библиотеки и стандарти (TLS 1.2/1.3, PKCS#1, OAEP, RSASSA-PSS).
- Не прилагайте RSA директно върху големи файлове — използвайте го за криптиране на ключове (hybrid encryption).
- Съхранявайте частните ключове защитено (HSM, TPM или поне криптирани с подходяща парола и с минимален достъп).
- Избирайте адекватен размер на ключа според нужната дълготрайност на защитата.
RSA остава един от фундаменталните методи в съвременната криптография — лесен за разбиране концептуално, широко внедрен в протоколи и продукти, но изисква внимателни имплементации и съответствие с текущите препоръки за безопасност.
Използвани концепции
RSA използва редица концепции от криптографията:
- Еднопосочна функция, която е лесна за изчисляване; намирането на функция, която я обръща, или изчисляването на тази функция е много трудно.
- RSA използва концепция, наречена дискретен логаритъм. Тя работи подобно на нормалния логаритъм: Разликата е, че се използват само цели числа и по принцип се използва операция модул. Като пример ax =b, modulo n. Дискретният логаритъм се състои в намирането на най-малкото x, което удовлетворява уравнението, когато са дадени a b и n
- Алгоритъмът на Шор може да му се противопостави.
Генериране на ключове
Ключовете за алгоритъма RSA се генерират по следния начин:
- Изберете две различни големи случайни прости числа
и
. Това трябва да се запази в тайна.
- Изчислете
.
е модулът за публичния ключ и частните ключове.
- Изчислете тотиента:
.
- Изберете цяло число
, такова че
, и
е съизмеримо с
.
Т.е.:и
нямат общи коефициенти, различни от
:
; Виж най-голям общ делител.
е освободен като експонента на публичния ключ.
- Изчислете
, за да удовлетворите отношението на конгруентност
.
т.е.:за някакво цяло число
. (Просто да се каже: Изчислете
да бъде цяло число)
се запазва като експонента на частния ключ.
Забележки към горните стъпки:
- Стъпка 1: Числата могат да бъдат вероятностно проверени за първичност.
- Стъпка 3: променена в PKCS#1 v2.0 на
вместо
.
- Стъпка 4: Популярен избор за публичните експоненти е
. Някои приложения избират по-малки стойности, като например
,
или
. Това се прави, за да се ускори криптирането и проверката на подписите при малки устройства като смарт карти, но малките публични експоненти могат да доведат до по-големи рискове за сигурността.
- Стъпки 4 и 5 могат да бъдат изпълнени с разширения алгоритъм на Евклид ; вж. модулна аритметика.
Публичният ключ
се състои от модула и публичния (или криптиращия) експонент
. Личният ключ се състои от p,q и частния (или декриптиращ) експонент
, който трябва да се пази в тайна.
- За по-голяма ефективност може да се съхранява различна форма на частния ключ:
и
: първичните числа от генерирането на ключа;
и
: често наричани dmp1 и dmq1;
: често се нарича iqmp.
- Всички части на частния ключ трябва да се пазят в тайна в тази форма.
и
са чувствителни, тъй като са коефициенти на
, и позволяват изчисляването на
при зададено
. Ако
и
не се съхраняват в тази форма на частния ключ, те се изтриват сигурно заедно с други междинни стойности от генерирането на ключа.
- Въпреки че тази форма позволява по-бързо декриптиране и подписване чрез използване на китайската теорема за остатъка (CRT), тя е значително по-малко сигурна, тъй като позволява атаки по странични канали . Това е особен проблем, ако се прилага върху смарт карти, които се възползват най-много от подобрената ефективност.
(Започнете си оставете картата да декриптира това. Така тя изчислява
или
, чиито резултати дават някаква стойност
. Сега предизвикайте грешка в едно от изчисленията. Тогава
ще покаже
или
.)
Криптиране на съобщение
Алиса дава своя публичен ключ на Боб и запазва частния си ключ в тайна. Боб иска да изпрати съобщение
на Алиса.
Първо той превръща в число
, по-малко от
, като използва договорен обратим протокол, известен като схема за подплънки. След това той изчислява шифровия текст
, съответстващ на:
Това може да стане бързо с помощта на метода на експонентиране чрез квадратиране. След това Боб изпраща на Алиса.
Декриптиране на съобщението
Алиса може да възстанови от
, като използва частния си ключ
по следната процедура:
Като има предвид , тя може да възстанови първоначалните различни прости числа, прилагайки китайската теорема за остатъците към тези две конгруенции, тя получава
.
По този начин,
.
Следователно:
Работен пример
Ето един пример за RSA криптиране и декриптиране. Използваните тук прости числа са твърде малки, за да ни позволят да криптираме безопасно каквото и да било. Можете да използвате OpenSSL, за да генерирате и изследвате истинска двойка ключове.
1. Изберете две случайни прости числа и
:
и
;
2. Изчислете :
;
3. Изчислете тотиентата :
;
4. Изберете коприма на
:
;
5. Изберете да удовлетворява
:
, като
.
Публичният ключ е (
). За подплатено съобщение
функцията за криптиране
става:
Частният ключ е (
). Функцията за декриптиране
става:
Например, за да криптирате , изчисляваме
За декриптиране на , изчисляваме
И двете изчисления могат да бъдат изчислени бързо и лесно с помощта на алгоритъма за модулно експонентиране "квадрат и умножение".
Извеждане на уравнението RSA от теоремата на Ойлер
RSA може лесно да бъде изведена с помощта на теоремата на Ойлер и функцията на Ойлер за тоталност.
Започваме с теоремата на Ойлер,
трябва да покажем, че декриптирането на криптирано съобщение с правилния ключ ще даде оригиналното съобщение. При дадено подплатено съобщение m, шифърът c се изчислява по следния начин
Замествайки в алгоритъма за декриптиране, получаваме
Искаме да покажем, че тази стойност също е конгруентна на m. Стойностите на e и d са избрани така, че да удовлетворяват,
Това означава, че съществува някакво цяло число k, такова, че
Сега заместваме криптираното, а след това декриптираното съобщение,
Прилагаме теоремата на Ойлер и получаваме резултата.
Схеми за подплатяване
Когато се използва в практиката, RSA трябва да се комбинира с някаква схема за подплънки, така че нито една стойност на M да не води до несигурни шифрови текстове. Използването на RSA без подложка може да доведе до някои проблеми:
- Стойностите m = 0 или m = 1 винаги водят до шифрограми, равни съответно на 0 или 1, поради свойствата на експоненцията.
- При криптиране с малки криптографски експоненти (напр. e = 3) и малки стойности на m (немодулният) резултат
може да бъде строго по-малък от модула n. В този случай шифровите текстове могат лесно да бъдат декриптирани, като се вземе коренът eth от шифровия текст, без да се взема предвид модулът.
- RSA криптирането е детерминистичен алгоритъм за криптиране. Той няма случаен компонент. Затова нападателят може успешно да извърши атака с избран чист текст срещу криптосистемата. Те могат да направят речник, като криптират вероятни открити текстове под публичния ключ и съхраняват получените шифротекстове. След това нападателят може да наблюдава комуникационния канал. Веднага щом видят шифротекстове, които съвпадат с тези в техния речник, нападателите могат да използват този речник, за да научат съдържанието на съобщението.
На практика първите два проблема могат да възникнат, когато се изпращат кратки ASCII съобщения. В такива съобщения m може да бъде конкатенация на един или повече ASCII-енкодирани символи. Съобщение, състоящо се от един ASCII символ NUL (чиято числова стойност е 0), би било кодирано като m = 0, което води до шифров текст от 0, независимо от това какви стойности на e и N се използват. По подобен начин един ASCII SOH (чиято числова стойност е 1) винаги би дал шифров текст от 1. За системи, които обичайно използват малки стойности на e, като например 3, всички еднозначни ASCII съобщения, кодирани по тази схема, биха били несигурни, тъй като най-голямото m би имало стойност 255, а 2553 е по-малко от всеки разумен модул. Такива открити текстове могат да бъдат възстановени, като просто се вземе коренът от куба на шифровия текст.
За да се избегнат тези проблеми, практическите реализации на RSA обикновено вграждат някаква форма на структурирана, рандомизирана подложка в стойността m, преди да я криптират. Тази подложка гарантира, че m не попада в обхвата на несигурните открити текстове и че дадено съобщение, след като бъде подплатено, ще се криптира до един от голям брой различни възможни шифрови текстове. Последното свойство може да увеличи цената на речниковата атака отвъд възможностите на разумен нападател.
Стандарти като PKCS са внимателно разработени, за да подплатяват по сигурен начин съобщенията преди криптирането с RSA. Тъй като тези схеми подплатяват открития текст m с определен брой допълнителни битове, размерът на неподплатеното съобщение M трябва да бъде малко по-малък. Схемите за подплатяване на RSA трябва да бъдат внимателно проектирани, за да се предотвратят сложни атаки. Това може да бъде улеснено чрез предвидима структура на съобщението. В ранните версии на стандарта PKCS са използвани ad-hoc конструкции, за които по-късно е установено, че са уязвими към практическа адаптивна атака с избран шифров текст. Съвременните конструкции използват сигурни техники, като например оптимална асиметрична криптираща подложка (OAEP), за да защитят съобщенията, като същевременно предотвратят тези атаки. Стандартът PKCS съдържа и схеми за обработка, предназначени да осигурят допълнителна сигурност за подписите RSA, например Вероятностната схема за подписване за RSA (RSA-PSS).
Подписване на съобщения
Да предположим, че Алиса използва публичния ключ на Боб, за да му изпрати криптирано съобщение. В съобщението тя може да твърди, че е Алиса, но Боб няма как да провери дали съобщението наистина е от Алиса, тъй като всеки може да използва публичния ключ на Боб, за да му изпраща криптирани съобщения. Така че, за да се провери произходът на дадено съобщение, RSA може да се използва и за подписване на съобщението.
Да предположим, че Алиса желае да изпрати подписано съобщение на Боб. Тя изготвя хеш стойност на съобщението, повишава я до степента на d mod n (както при декриптиране на съобщение) и я прикачва като "подпис" към съобщението. Когато Боб получи подписаното съобщение, той повишава подписа до степента на e mod n (точно както при криптиране на съобщение) и сравнява получената хеш стойност с действителната хеш стойност на съобщението. Ако двете стойности съвпадат, той знае, че авторът на съобщението е притежавал тайния ключ на Алиса и че съобщението не е било подправяно оттогава.
Обърнете внимание, че схемите за сигурна подложка, като например RSA-PSS, са също толкова важни за сигурността на подписването на съобщенията, колкото и за криптирането им, и че един и същ ключ никога не трябва да се използва както за криптиране, така и за подписване.
Въпроси и отговори
В: Какво е RSA?
О: RSA (Rivest-Shamir-Adleman) е алгоритъм, използван от съвременните компютри за криптиране и декриптиране на съобщения. Това е асиметричен криптографски алгоритъм.
В: Какво означава асиметричен?
О: Асиметричен означава, че има два различни ключа - публичен и частен ключ.
В: Каква е основата на алгоритъма RSA?
О: Алгоритъмът се основава на факта, че намирането на множителите на голямо съставно число е трудно - когато множителите са прости числа, този проблем се нарича проста факторизация.
В: Как работи RSA?
О: RSA включва публичен ключ и частен ключ. Публичният ключ може да бъде известен на всеки - той се използва за криптиране на съобщения. Съобщенията, криптирани с публичния ключ, могат да бъдат декриптирани само с частния ключ, който трябва да се пази в тайна. Изчисляването на частния ключ от публичния ключ е много трудно.
Въпрос: Има ли друго наименование за този вид криптография?
О: Този тип криптография се нарича още криптография с публичен ключ, защото единият от ключовете може да бъде даден на всеки, като другият остава частен.
Въпрос: RSA генерира ли двойка ключове?
О: Да, RSA генерира двойка ключове - публичен и частен ключ - които се използват съответно за криптиране и декриптиране.
обискирам