Алгоритъм RSA | алгоритъм за криптиране и декриптиране на съобщения

RSA (Rivest-Shamir-Adleman) е алгоритъм, използван от съвременните компютри за криптиране и декриптиране на съобщения. Това е асиметричен криптографски алгоритъм. Асиметричен означава, че има два различни ключа. Нарича се още криптография с публичен ключ, тъй като единият от ключовете може да бъде даден на всеки. Другият ключ трябва да се пази в тайна. Алгоритъмът се основава на факта, че намирането на множителите на голямо съставно число е трудно: когато множителите са прости числа, проблемът се нарича просто факторизиране. Той също така е генератор на двойка ключове (публичен и частен ключ).

RSA включва публичен ключ и частен ключ. Публичният ключ може да бъде известен на всеки - той се използва за криптиране на съобщения. Съобщенията, криптирани с публичния ключ, могат да бъдат декриптирани само с частния ключ. Частният ключ трябва да се пази в тайна. Изчисляването на частния ключ от публичния ключ е много трудно.



 

Използвани концепции

RSA използва редица концепции от криптографията:

  • Еднопосочна функция, която е лесна за изчисляване; намирането на функция, която я обръща, или изчисляването на тази функция е много трудно.
  • RSA използва концепция, наречена дискретен логаритъм. Тя работи подобно на нормалния логаритъм: Разликата е, че се използват само цели числа и по принцип се използва операция модул. Като пример ax =b, modulo n. Дискретният логаритъм се състои в намирането на най-малкото x, което удовлетворява уравнението, когато са дадени a b и n
  • Алгоритъмът на Шор може да му се противопостави.


 

Генериране на ключове

Ключовете за алгоритъма RSA се генерират по следния начин:

  1. Изберете две различни големи случайни прости числа {\displaystyle p} и q . Това трябва да се запази в тайна.
  2. Изчислете {\displaystyle n=pq} .
    • n е модулът за публичния ключ и частните ключове.
  3. Изчислете тотиента: {\displaystyle \phi (n)=(p-1)(q-1)} .
  4. Изберете цяло число {\displaystyle e} , такова че {\displaystyle 1<e<\phi (n)} , и {\displaystyle e} е съизмеримо с {\displaystyle \phi (n)} .
    Т.е.:
    {\displaystyle e} и {\displaystyle \phi (n)} нямат общи коефициенти, различни от {\displaystyle 1}: {\displaystyle \gcd(e,\phi (n))=1} ; Виж най-голям общ делител.
    • {\displaystyle e} е освободен като експонента на публичния ключ.
  5. Изчислете {\displaystyle d} , за да удовлетворите отношението на конгруентност {\displaystyle de\equiv 1\!\!\!\!{\pmod {\phi (n)}}} .
    т.е.:
    {\displaystyle de=1+x\cdot \phi (n)} за някакво цяло число x . (Просто да се каже: Изчислете {\displaystyle d=(1+x\cdot \phi (n))/e} да бъде цяло число)
    • {\displaystyle d} се запазва като експонента на частния ключ.

Забележки към горните стъпки:

  • Стъпка 1: Числата могат да бъдат вероятностно проверени за първичност.
  • Стъпка 3: променена в PKCS#1 v2.0 на {\displaystyle \lambda (n)={\rm {lcm}}(p-1,q-1)} вместо {\displaystyle \phi (n)=(p-1)(q-1)} .
  • Стъпка 4: Популярен избор за публичните експоненти е {\displaystyle e=2^{16}+1=65537} . Някои приложения избират по-малки стойности, като например {\displaystyle e=3}, {\displaystyle 5}или {\displaystyle 35} . Това се прави, за да се ускори криптирането и проверката на подписите при малки устройства като смарт карти, но малките публични експоненти могат да доведат до по-големи рискове за сигурността.
  • Стъпки 4 и 5 могат да бъдат изпълнени с разширения алгоритъм на Евклид [en]; вж. модулна аритметика.

 Публичният ключ
се състои от модула {\displaystyle n\,} и публичния (или криптиращия) експонент {\displaystyle e\,} . Личният ключ се състои от p,q и частния (или декриптиращ) експонент {\displaystyle d\,} , който трябва да се пази в тайна.

  • За по-голяма ефективност може да се съхранява различна форма на частния ключ:
    • {\displaystyle p} и q : първичните числа от генерирането на ключа;
    • {\displaystyle d{\bmod {(}}p-1)} и {\displaystyle d{\bmod {(}}q-1)} : често наричани dmp1 и dmq1;
    • {\displaystyle q^{-1}{\bmod {p}}} : често се нарича iqmp.
  • Всички части на частния ключ трябва да се пазят в тайна в тази форма. {\displaystyle p\,} и {\displaystyle q\,} са чувствителни, тъй като са коефициенти на {\displaystyle n\,} , и позволяват изчисляването на {\displaystyle d\,} при зададено {\displaystyle e\,} . Ако {\displaystyle p\,} и {\displaystyle q\,} не се съхраняват в тази форма на частния ключ, те се изтриват сигурно заедно с други междинни стойности от генерирането на ключа.
  • Въпреки че тази форма позволява по-бързо декриптиране и подписване чрез използване на китайската теорема за остатъка (CRT), тя е значително по-малко сигурна, тъй като позволява атаки по странични канали [en]. Това е особен проблем, ако се прилага върху смарт карти, които се възползват най-много от подобрената ефективност. 
    (Започнете с
    {\displaystyle y\equiv x^{e}\!\!\!\!{\pmod {n}}}и оставете картата да декриптира това. Така тя изчислява {\displaystyle (y^{d}{\bmod {p}})} или {\displaystyle (y^{d}{\bmod {q}})}, чиито резултати дават някаква стойност {\displaystyle z} . Сега предизвикайте грешка в едно от изчисленията. Тогава {\displaystyle \gcd(z-x,n)} ще покаже {\displaystyle p} или q .)


 

Криптиране на съобщение

Алиса дава своя публичен ключ {\displaystyle (n,e)} на Боб и запазва частния си ключ в тайна. Боб иска да изпрати съобщение {\displaystyle M} на Алиса.

Първо той превръща {\displaystyle M} в число m , по-малко от n , като използва договорен обратим протокол, известен като схема за подплънки. След това той изчислява шифровия текст {\displaystyle c\,} , съответстващ на:

{\displaystyle c=m^{e}\mod {n}}

Това може да стане бързо с помощта на метода на експонентиране чрез квадратиране. След това Боб изпраща {\displaystyle c\,} на Алиса.



 

Декриптиране на съобщението

Алиса може да възстанови {\displaystyle m\,} от {\displaystyle c\,} , като използва частния си ключ {\displaystyle d\,} по следната процедура:

Като има предвид {\displaystyle m\,} , тя може да възстанови първоначалните различни прости числа, прилагайки китайската теорема за остатъците към тези две конгруенции, тя получава

{\displaystyle m^{ed}\equiv m{\bmod {pq}}} .

По този начин,

{\displaystyle c^{d}\equiv m{\bmod {n}}} .

Следователно:

{\displaystyle m=c^{d}\ mod\ n}

Работен пример

Ето един пример за RSA криптиране и декриптиране. Използваните тук прости числа са твърде малки, за да ни позволят да криптираме безопасно каквото и да било. Можете да използвате OpenSSL, за да генерирате и изследвате истинска двойка ключове.

1. Изберете две случайни прости числа {\displaystyle p} и {\displaystyle q\,} :

{\displaystyle p=61} и {\displaystyle q=53\,} ;

2. Изчислете {\displaystyle n=pq\,} :

{\displaystyle n=61\times 53=3233\!} ;

3. Изчислете тотиентата {\displaystyle \phi (n)=(p-1)(q-1)} :

{\displaystyle \phi (n)=(61-1)(53-1)=3120\!} ;

4. Изберете {\displaystyle e>1} коприма на {\displaystyle 3120\,} :

{\displaystyle e=17\,} ;

5. Изберете {\displaystyle d\,} да удовлетворява {\displaystyle ed\equiv 1{\bmod {\phi (n)}}} :

{\displaystyle d=2753\,} , като {\displaystyle 17\times 2753=46801=1+15\times 3120} .

 Публичният ключ е ( {\displaystyle n=3233} {\displaystyle e=17} ). За подплатено съобщение {\displaystyle m\,} функцията за криптиране {\displaystyle c=m^{e}{\bmod {n}}} става:

{\displaystyle c=m^{17}{\bmod {3}}233\,}

Частният ключ е ( {\displaystyle n=3233} {\displaystyle d=2753} ). Функцията за декриптиране {\displaystyle m=c^{d}{\bmod {n}}} става:

{\displaystyle m=c^{2753}{\bmod {3}}233\,}


 Например, за да криптирате {\displaystyle m=123}, изчисляваме

{\displaystyle c=123^{17}{\bmod {3}}233=855}

За декриптиране на {\displaystyle c=855}, изчисляваме

{\displaystyle m=855^{2753}{\bmod {3}}233=123}

И двете изчисления могат да бъдат изчислени бързо и лесно с помощта на алгоритъма за модулно експонентиране "квадрат и умножение".



 

Извеждане на уравнението RSA от теоремата на Ойлер

RSA може лесно да бъде изведена с помощта на теоремата на Ойлер и функцията на Ойлер за тоталност.

Започваме с теоремата на Ойлер,

{\displaystyle m^{\phi (n)}\equiv 1{\pmod {n}}}

трябва да покажем, че декриптирането на криптирано съобщение с правилния ключ ще даде оригиналното съобщение. При дадено подплатено съобщение m, шифърът c се изчислява по следния начин

{\displaystyle c\equiv m^{e}{\pmod {n}}}

Замествайки в алгоритъма за декриптиране, получаваме

{\displaystyle c^{d}\equiv (m^{e})^{d}\equiv m^{ed}{\pmod {n}}}

Искаме да покажем, че тази стойност също е конгруентна на m. Стойностите на e и d са избрани така, че да удовлетворяват,

{\displaystyle ed\equiv 1{\pmod {\phi (n)}}}

Това означава, че съществува някакво цяло число k, такова, че

{\displaystyle ed=k\times \phi (n)+1}

Сега заместваме криптираното, а след това декриптираното съобщение,

{\displaystyle {\begin{aligned}m^{ed}&\equiv m^{k\phi (n)+1}\\&\equiv m\times m^{k\phi (n)}\\&\equiv m\times \left(m^{\phi (n)}\right)^{k}{\pmod {n}}\end{aligned}}}

Прилагаме теоремата на Ойлер и получаваме резултата.

{\displaystyle m\times (1)^{k}\equiv m{\pmod {n}}}



 

Схеми за подплатяване

Когато се използва в практиката, RSA трябва да се комбинира с някаква схема за подплънки, така че нито една стойност на M да не води до несигурни шифрови текстове. Използването на RSA без подложка може да доведе до някои проблеми:

  • Стойностите m = 0 или m = 1 винаги водят до шифрограми, равни съответно на 0 или 1, поради свойствата на експоненцията.
  • При криптиране с малки криптографски експоненти (напр. e = 3) и малки стойности на m (немодулният) резултат {\displaystyle m^{e}} може да бъде строго по-малък от модула 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 генерира двойка ключове - публичен и частен ключ - които се използват съответно за криптиране и декриптиране.

AlegsaOnline.com - 2020 / 2023 - License CC3