Asymmetric key cryptography
Sa araling ito, titingnan natin ang asymmetric key cryptography na siyang pundasyon ng maraming ligtas na pakikipag-ugnayan sa network ngayon.
Sa pagtatapos ng aralin, matatalakay natin ang:
- Ano ang asymmetric key cryptography
- Paggamit ng asymmetric key cryptography, kabilang ang key exchange at digital signatures
- Seguridad ng asymmetric key cryptography sa pangkalahatan
- Karagdagang detalye tungkol sa RSA, DSA, at Elliptic Curves na mga algorithm at seguridad
- Ilang halimbawa ng Python code na nagpapakita kung paano gumagana ang mga algorithm sa praktiko
- Mga banta sa mga algorithm na ito mula sa parehong klasikal at quantum na mga computer
Panimula sa asymmetric key cryptographyβ
Tulad ng natutunan natin sa huling aralin, ang symmetric key cryptography ay napakabilis at mahusay para sa pagprotekta ng impormasyon, ngunit mayroon itong ilang limitasyon:
- Habang dumarami ang mga partido na gustong mag-palitan ng ligtas na impormasyon, ang bilang ng mga kinakailangang key ay lumalaki nang combinatorially. Walang mekanismong ligtas na maipamahagi ang mga key na ito sa pagitan ng mga nagpadala at tatanggap.
- Walang probisyon para sa non-repudiation. Ang sinumang partido ay maaaring mag-decrypt o mag-encrypt ng mga mensahe nang walang paraan upang matiyak na natanggap ang isang mensahe o kung saan ito nanggaling.
Ang solusyon sa parehong mga problemang ito ay ibinibigay ng asymmetric key cryptography (AKC), na kilala rin bilang public key cryptography (PKC), na siyang isa sa mga pundasyon ng modernong digital na seguridad.
Ang asymmetric key cryptography (AKC) ay gumagamit ng pares ng mga key β isa ay pampubliko, isa ay pribado. Ang mga pampubliko at pribadong key ay cryptographically na magkaugnay at karaniwang nalilikha nang sabay bilang isang key pair gamit ang isang espesyalisadong mathematical na algorithm. Ang pampublikong key, tulad ng iminumungkahi ng pangalan nito, ay dapat na malayang ipamahagi, habang ang pribadong key ay pinananatiling lihim ng partido na bumubuo ng key pair. Ang seguridad ng mga komunikasyon gamit ang asymmetric key pairs ay natitiyak hangga't nananatiling kumpidensyal ang pribadong key.

Larawan 1. Asymmetric Key Encryption
Nag-aalok ang AKC ng ilang kapaki-pakinabang na mga function, tulad ng:
- Encryption at decryption upang paganahin ang pagiging kumpidensyal ng mga komunikasyon.
- Digital signatures upang matiyak ang pagiging tunay, integridad, at non-repudiation.
- Ligtas na key exchange upang mapadali ang kasunod na paggamit ng mga symmetric cryptosystem.
Sa mga modernong aplikasyon, ang AKC ay pangunahing ginagamit para sa mga digital signature at ligtas na key exchange. Sa araling ito, ipinapakilala natin ang dalawang pangunahing function na ito, at pagkatapos ay tatalakayin natin ang ilang mga variation ng cryptographic protocol para sa mga function na ito.
Key exchange gamit ang asymmetric key cryptographyβ
Isa sa mga pundamental na problema sa cryptography ay ang ligtas na pagpapalitan ng mga key. Halimbawa, kung dalawang partido ang gustong gumamit ng symmetric encryption, kailangan ng parehong partido ang parehong key para mag-encrypt at mag-decrypt ng mga mensahe. Ngunit paano sila ligtas na makakapagpalitan ng key? Tinutugunan ito ng asymmetric key cryptography sa pamamagitan ng interactive at non-interactive na mga mekanismo ng key exchange.
Interactive key exchangeβ
Ang isang interactive key exchange protocol ay tumutukoy sa isang paraan kung saan ang dalawang partido ay nakikipagtulungan upang lumikha ng isang shared secret key sa pamamagitan ng isang hindi ligtas na channel ng komunikasyon. Ang shared secret key na ito ay maaaring gamitin para sa mga gawain ng symmetric encryption at decryption.
Ang pinakakilala sa mga naturang protocol ay ang Diffie-Hellman algorithm (DH), na partikular na idinisenyo upang mapadali ang key exchange. Sa protocol na ito, bawat partido ay bumubuo ng pares ng mga key (pampubliko at pribado) at ipina-broadcast ang kanilang pampublikong key. Pagkatapos, ginagamit ng bawat partido ang sarili nilang pribadong key at ang pampublikong key ng kabilang partido upang makabuo ng shared secret key. Gumagamit ang DH ng mga prinsipyo ng modular arithmetic upang matiyak na parehong partido ay magtatapos na may parehong shared secret kahit na ang bawat partido ay may access lamang sa pampublikong key ng kabilang partido.
Ang mga modernong cryptosystem batay sa elliptic curve cryptography (ECC) ay nagpapalawak ng konseptong ito gamit ang elliptic curve Diffie-Hellman (ECDH) key exchange. Ang ECDH ay gumagana nang katulad sa DH ngunit gumagamit ng mga katangian ng elliptic curves, na nagresulta sa isang mas ligtas at mahusay na sistema.

Larawan 2. Key Exchange Protocol
Non-interactive key exchangeβ
Hindi tulad ng mga key exchange protocol tulad ng DH at ECDH, na interactive, na nangangailangan ng pabalik-balik na komunikasyon upang mapagpasyahan ang symmetric key, nagbibigay din ang AKC ng mga non-interactive na paraan upang maitatag ang isang shared secret key. Sa mga ganitong scheme, ang isang partido ay bumubuo ng pares ng mga key (pampubliko at pribado) at ibinabahagi ang pampublikong key sa kabilang partido. Ang pangalawang partido ay bumubuo ng isang random na symmetric key, ine-encrypt ito gamit ang natanggap na pampublikong key, at ibinabalik ito sa unang partido. Ginagamit ng unang partido ang kanilang pribadong key upang i-decrypt ang natanggap na mensahe, at sa gayon ay nakukuha ang shared symmetric key. Ang scheme na ito ay non-interactive sa aspeto na ang symmetric key ay tinutukoy ng isang partido at simpleng ligtas na ikomunika sa kabilang partido sa naka-encrypt na anyo.
Ang isang mahalagang pagsasaalang-alang sa non-interactive key exchange ay may kinalaman sa pagkakaiba ng haba sa bits sa pagitan ng symmetric key na gustong ipagpalitan ng mga partido at mga inirerekomendang laki ng mensahe sa AKC. Karaniwan, ang mga modernong symmetric key ay nasa hanay na 128-256 bits ang haba, habang ang mga asymmetric key cryptosystem tulad ng RSA ay gumagana sa mga laki ng mensahe na humigit-kumulang 1024-4096 bits ang haba. Samakatuwid, kapag gumagamit ng AKC upang maipadala ang isang symmetric key, para sa seguridad ay kailangang i-encode pa rin ito sa isang mas mahabang mensaheng 1024-4096 bits. Maaari itong makamit sa pamamagitan ng dalawang paraan:
-
Padding-based key exchange: Sa paraang ito, ang mas maikling (128-256 bits) symmetric key ay unang nalilikha at pagkatapos ay isang napagkasunduang reversible na padding scheme tulad ng OAEP ay ginagamit upang i-embed ito sa isang mas mahabang (1024-4096 bits) mensahe. Ang mas mahabang mensaheng ito ay ine-encrypt gamit ang AKC at ipina-broadcast bilang ciphertext. Ang tatanggap ay unang dini-decrypt ang ciphertext at pagkatapos ay inaalis ang padding upang makuha ang mas maikling symmetric key.
-
Key encapsulation mechanisms (KEMs): Sa KEM-based key exchange, ang isang random, mahabang (1024-4096 bits) plain text na mensahe ay unang nalilikha, mula sa kung saan maaaring makuha ang isang mas maikling (128-256 bits) symmetric key gamit ang isang napagkasunduang key derivation function (KDF). Ang mas mahabang plain text ay ine-encrypt gamit ang AKC at ipina-broadcast sa tatanggap bilang ciphertext. Dini-decode ng tatanggap ang ciphertext gamit ang kanilang pribadong key at pagkatapos ay ginagamit ang KDF upang makuha ang mas maikling (128-256 bits) symmetric key. Ang mga popular na cryptosystem tulad ng RSA, na may kakayahang direktang mag-encrypt ng data, ay maaaring gamitin upang maipatupad ang mga KEM.

Larawan 3. Key Encapsulation Mechanism
Digital signatures gamit ang asymmetric key cryptographyβ
Ang mga digital signature ay isa pang makapangyarihang aplikasyon ng asymmetric key cryptography. Nagbibigay sila ng authentication, integridad, at nonrepudiation na pinagana ng katotohanan na sa loob ng AKC, ang mga entidad ay nagtataglay ng natatanging mga pribadong key. Ang pangunahing ideya sa likod ng mga signature protocol ay ang mga nagpadala ng mga ligtas na mensahe ay digitally pipirmahan din ang mga mensahe gamit ang kanilang natatanging pribadong key. Ang tatanggap ay mag-ve-verify ng digital signature gamit ang pampublikong key ng nagpadala. Sa loob ng AKC, ang mga digital signature ay maaaring maipatupad sa pamamagitan ng paggamit ng mga algorithm na espesyal na idinisenyo para sa layuning iyon o sa pamamagitan ng paggamit ng mga generic na cryptosystem.

Larawan 4. Digital signatures gamit ang asymmetric key cryptography
Mga dedicated na digital signature algorithmβ
Sa kasalukuyan, ang US Federal Information Processing Standard (FIPS) para sa mga digital signature ay isang dedicated na scheme na simpleng pinamagatang Digital Signature Algorithm (DSA). Medyo katulad sa Diffie-Hellman protocol, ginagamit ng DSA ang algebraic na katangian ng modular exponential at multiplicative inverses para sa pagbuo at pag-verify ng signature.
Ang elliptic curve digital signature algorithm (ECDSA) ay isang ECC variant ng DSA, na nagbibigay ng parehong functionality ngunit may mas maikling mga key. Nagresulta ito sa pinahusay na kahusayan, na ginagawa itong popular na pagpipilian para sa mga sistema na may limitasyon sa resources.
Ang parehong DSA at ECDSA ay ilalalarawan nang mas detalyado sa ibang pagkakataon.
Mga digital signature scheme gamit ang mga generic na cryptosystemβ
Bukod sa mga dedicated na algorithm, ang mga digital signature ay maaari ring mabuo gamit ang mga generic na asymmetric cryptosystem, tulad ng RSA.
Ang RSA, na tatalakayin nang detalyado sa susunod na seksyon, ay gumagamit din ng modular multiplicative inverses at modular exponentiation bilang mga pundamental na operasyon ngunit pinagsama ang mga ito sa ibang pagkakasunud-sunod kaysa sa DSA. Sa RSA, ang signer ay karaniwang gumagawa ng hash ng mensahe at pagkatapos ay ine-encrypt ang hash gamit ang kanilang pribadong key, na lumilikha ng digital signature. Ang sinumang partido ay maaaring i-verify ang signature na ito sa pamamagitan ng pag-decrypt nito gamit ang pampublikong key ng signer at pagkukumpara nito sa hashed na mensahe.
Mga aplikasyon ng asymmetric key cryptographyβ
Ang asymmetric key cryptography ay laganap sa mga modernong aplikasyon ng digital na teknolohiya. Ang mga pangunahing functionality ng AKC na inilalarawan sa itaas ay bumubuo ng mga building block ng maraming higher-level na application protocol, kabilang ang:
-
Komunikasyon sa internet: Ang ligtas na komunikasyon sa internet, tulad ng HTTPS, ay mabigat na umaasa sa asymmetric key cryptography. Ang Transport Layer Security (TLS) at ang nauna nitong Secure Sockets Layer (SSL), ay gumagamit ng asymmetric key cryptography sa panahon ng paunang proseso ng handshake upang maitatag ang isang symmetric key, na ginagamit sa natitirang bahagi ng session ng komunikasyon.
-
Authentication: Ang asymmetric key cryptography ay ginagamit upang lumikha ng mga digital signature, na nagpapahintulot sa isang entidad na i-authenticate ang isang digital na dokumento o mensahe na nagmula sa isang partikular na nagpadala. Ginagamit ito sa maraming sitwasyon, mula sa pag-verify ng mga software update hanggang sa mga legal na binding na digital na kontrata.
-
Email encryption: Ang mga email encryption protocol tulad ng PGP (Pretty Good Privacy) at ang open-source na alternatibo nitong GPG (GNU Privacy Guard) ay gumagamit ng asymmetric key cryptography upang matiyak na ang nilalaman ng email ay mababasa lamang ng nilayong tatanggap.
-
Secure shell (SSH): Ang SSH ay isang protocol para sa ligtas na remote login at iba pang ligtas na serbisyo ng network sa pamamagitan ng isang hindi ligtas na network. Gumagamit ito ng asymmetric key cryptography upang ma-authenticate ang server sa client at, opsyonal, ang client sa server.
-
VPN (virtual private network): Ginagamit ang asymmetric key encryption upang maitatag ang mga ligtas na koneksyon sa mga VPN, na tinitiyak ang ligtas na komunikasyon sa pamamagitan ng mga pampublikong network.
-
Blockchain at mga cryptocurrency: Ang mga teknolohiya ng blockchain, kabilang ang Bitcoin at Ethereum, ay gumagamit ng asymmetric key cryptography. Halimbawa, ang pagmamay-ari ng Bitcoin ay itinatag sa pamamagitan ng mga digital signature gamit ang asymmetric key cryptography.
-
Mga certificate authority: Ang asymmetric key cryptography ay ginagamit ng mga certificate authority (CA) upang mag-issue at pumirma ng mga digital na sertipiko, na ginagamit sa TLS communication, code signing, email encryption, at iba pa. Ang isang digital na sertipiko ay nagbubuklod ng isang pampublikong key sa isang partikular na entidad (halimbawa, isang tao o server).

Larawan 5. Pag-issue at pagpirma ng mga digital na sertipiko gamit ang asymmetric key cryptography
Seguridad ng asymmetric key cryptographyβ
Ilang cryptographic na konsepto ang nagsasama upang paganahin ang ligtas na asymmetric key cryptography, kabilang ang:
Lihimang pribadong key: Ang pinakabasikong kinakailangan sa seguridad ng AKC ay ang pribadong key ay nananatiling lihim. Gayunpaman, dahil ang pribadong key ay dapat na mathematically na naka-link sa pampublikong key, ang pagiging lihim ng pribadong key ay nangangailangan din na hindi maisagawa sa computational ang pagkuha ng pribadong key mula sa kaalaman ng pampublikong key. Ang mga scheme ng pagbuo ng key sa loob ng AKC ay umaasa sa mga computationally mahirap na mathematical na problema upang mapadali ang kinakailangang ito.
Trapdoor functionality: Sa AKC, ang mga operasyon ng encryption at decryption ay gumagamit ng iba't ibang complementary na mga key mula sa isang key pair. Ang Ciphertext na nalikhang sa pamamagitan ng encryption gamit ang isa sa mga key (halimbawa ang pampublikong key) ay dapat na hindi maintindihan ng mga ikatlong partido habang madaling ma-decrypt ng may hawak ng complementary na key (sa kasong ito ang pribadong key). Sa madaling salita, ang encryption ay dapat na kahawig ng isang trapdoor one-way function upang ang mga ikatlong partido ay hindi maka-invert ng operasyon at mabawi ang plain text ngunit ang pribadong key ay nagbibigay ng lihim na trapdoor na nagbibigay-daan sa madaling pag-invert. Ang mga popular na AKC algorithm ay gumagamit ng modular exponentiation upang maitatag ang gawi ng trapdoor one-way function.
Randomness: Ang proseso ng pagbuo ng key ay dapat ding gumamit ng randomness upang matiyak na ang mga key ay hindi mahuhulaan, dahil ang anumang pattern o predictability sa pagbuo ng key ay maaaring mapagsamantalahan ng isang attacker. Ang randomness ay ginagamit din para sa padding sa panahon ng encryption upang makabuo ng semantically secure na mga ciphertext at sa loob ng mga digital signature scheme upang makagawa ng natatanging mga signature kahit na ang parehong mensahe ay pinirmahan nang maraming beses. Para sa kadahilanang ito, ang paggamit ng mga malakas na random number generator ay isang mahalagang bahagi ng AKC.
Malaking laki ng key: Tulad ng kaso ng SKC, ang malalaking laki ng key ay nagbibigay ng proteksyon laban sa brute force attack. Gayunpaman, dahil ang malalaking laki ng key ay nagpapataas din ng computational na gastos ng proseso ng encryption at decryption, ang isang optimal na solusyon ay kailangang balansehin ang mga pagsasaalang-alang sa seguridad at kahusayan. Ang sumusunod na talahanayan ay nagpapakita ng mga tipikal na laki ng key para sa iba't ibang asymmetric key cryptography protocol at aplikasyon:
| Protocol | Mga Tipikal na Laki ng Key (sa bits) | Aplikasyon |
|---|---|---|
| RSA | 1024 (deprecated), 2048, 3072, 4096 | Encryption, digital signatures |
| DSA | 1024 (deprecated), 2048, 3072 | Digital signatures |
| DH | 2048, 3072, 4096 | Key exchange |
| ECDH | 224, 256, 384, 521 | Key exchange |
| ECDSA | 224, 256, 384, 521 | Digital signatures |
Public key infrastructure: Sa AKC, ang mga pribadong key ay dapat na panatilihing lihim ng mga may-ari habang ang mga pampublikong key ay ibinabahagi. Kailangan ng isang ligtas na mekanismo upang pamahalaan at ipamahagi ang mga pampublikong key na ito sa pagitan ng mga gumagamit. Ang Public key infrastructure (PKI) ay nagbibigay ng isang paraan upang gawin ito gamit ang mga digital na sertipiko. Ang isang digital na sertipiko ay nagbibigay ng patunay ng pagkakakilanlan ng may-ari ng pampublikong key at inilalabas ng isang pinagkakatiwalaang awtoridad tulad ng isang certificate authority (na bahagi ng PKI). Kaya, ang PKI ay gumaganap ng mahalagang bahagi sa seguridad ng modernong aplikasyon gamit ang AKC sa pamamagitan ng pagpapagana ng large-scale na pamamahala ng key (sa pamamagitan ng paglikha, pamamahala, pamamahagi at pagbawi ng mga digital na sertipiko).
Mga panganib sa seguridad ng asymmetric key cryptographyβ
Tulad ng nakasaad sa talahanayan sa itaas, ang mga modernong asymmetric key algorithm tulad ng RSA ay karaniwang gumagamit ng mas malalaking laki ng key kaysa sa mga karaniwang ginagamit na symmetric key counterpart tulad ng AES-128. Kahit ang mga ECC-based na protocol (ECDH at ECDSA) na may mas maliliit na laki ng key ay gumagamit ng minimum na hindi bababa sa 224 bits para sa mga key. Ito naman ay nagpapahiwatig na ang isang brute force attack na kinabibilangan ng exhaustive search ng private key space upang matukoy ang tamang key ay computationally intractable sa nakikitang hinaharap. Nananatili itong totoo kahit na ang mga quantum computer ay ilalagay para sa gawaing ito. Samakatuwid, ang mga pag-atake laban sa AKC ay karaniwang nakatuon sa pagsasamantala ng iba pang posibleng kahinaan ng mga partikular na cryptosystem. Ilang well-documented na attack mode ang nagta-target:
-
Kahinaan ng algorithm sa pamamagitan ng paggamit ng mga sopistikadong mathematical at computational na paraan upang sirain ang mga hardness assumption na ginamit upang bumuo ng mga asymmetric key algorithm. Halimbawa, ang seguridad ng RSA ay nakabase sa kahirapan ng pag-factor ng malalaking prime number, at ang mga kamakailang computational na pagsulong ay nagpahintulot ng matagumpay na pag-factor ng 829-bit na RSA key. Samakatuwid, ang 1024-bit na RSA ay kasalukuyang deprecated. Tulad ng tatalakayin sa ibang pagkakataon, ang pangunahing panganib na inilalahad ng mga quantum computer sa AKC ay napapabilang din sa kategoryang ito.
-
Hindi perpektong randomness, na maaaring magdulot ng kahinaan sa proseso ng pagbuo ng key. Halimbawa, kung ang random number generator na ginagamit upang lumikha ng mga key ay may depekto at bumubuo ng mga key na hindi tunay na random, maaaring matukoy ng isang attacker ang mga key.
-
Mga depekto sa implementasyon tulad ng mga pagkakamali sa implementasyon ng mga cryptographic algorithm na hindi sinasadyang nagbubunyag ng impormasyon tungkol sa mga key. Halimbawa, ang maling padding ay maaaring potensyal na magbunyag ng mga detalye tungkol sa mga key.
-
Mga side channel na tumutukoy sa pagtagas ng impormasyon mula sa pisikal na sistema na gumaganap ng cryptography. Ang ganitong mga pagtagas ay maaaring nasa anyo ng impormasyon sa timing, pagkonsumo ng kuryente, o kahit tunog, na maaaring mapagsamantalahan sa tinatawag na side-channel attack. Halimbawa, ang pagsusuri kung gaano katagal ang mga cryptographic na operasyon na isasagawa ay maaaring magbunyag ng bilang ng mga '1' sa isang binary key. Ang tila walang masamang pagtagas na ito ay makabuluhang nagpapaliit ng search space, na nagbubunyag ng mga potensyal na solusyon sa mga problemang sa una ay tila hindi malulutas.
-
Key exchange sa pamamagitan ng pagharang sa mga key habang ito ay ipinalpalitan, tulad ng sa loob ng isang man-in-the-middle attack (MITM). Ang DH protocol ay madaling atakihin ng MITM kung walang karagdagang hakbang ng authentication.
-
Key storage sa pamamagitan ng paglalayon na magnakaw ng mga key mula sa hindi ligtas na storage. Kasama dito ang mga pisikal na pag-atake tulad ng manipulasyon o pagnanakaw ng mga device ng storage.
Ang pag-secure ng mga asymmetric key cryptosystem laban sa iba't ibang pag-atake na posible ay samakatuwid isang makabuluhang gawain na kinabibilangan ng mga mathematical, hardware, software, logistical, at legal na pagsasaalang-alang.
RSAβ
Ang RSA (Rivest-Shamir-Adleman) algorithm ay isa sa mga unang public key cryptosystem at malawakang ginagamit para sa ligtas na pagpapadala ng data. Isa itong versatile na cryptosystem dahil nagbibigay ito ng mga kinakailangang operasyon upang paganahin ang encryption, decryption, mga digital signature, at key exchange sa loob ng isang karaniwang balangkas.
Sa seksyong ito, ilalarawan natin ang asymmetric key cryptography (AKC) gamit ang RSA sa pamamagitan ng mga simpleng halimbawa.
Gagamitin natin ang karaniwang senaryo ng dalawang partido, si Alice at Bob, na gustong makipag-usap nang ligtas gamit ang AKC.
Ang RSA algorithmβ
Ang pangunahing RSA algorithm ay kinabibilangan ng apat na operasyon: key generation, key distribution, encryption, at decryption:
-
Key generation:
Ang mga pampubliko at pribadong key ay nalilikha batay sa mga mathematical na prinsipyo tungkol sa mga prime number, kung saan ang pagkalkula ng mga ito ay madali, ngunit ang kabaligtaran ay mahirap.
Ito ang ating gagamitin:
- Pampublikong key:
- Pribadong key:
Tandaan na ang ay karaniwan sa parehong pampubliko at pribadong key, at kilala bilang modulus. Kakailanganin nating gamitin ito sa ibang pagkakataon.
Mathematical na detalye
- Pumili ng dalawang natatanging prime number, at .
- pinili nang random (para sa seguridad).
- Dapat silang magkatulad sa magnitude, ngunit mag-iiba ng ilang digit sa haba, upang gawing mas mahirap ang pag-factor.
- Ang mga prime number ay maaaring mahusay na mapili gamit ang isang primality test.
- Kalkulahin ang .
- Ang ay ang modulus para sa parehong pampubliko at pribadong key.
- Kalkulahin ang totient .
- Ang totient ay dapat na panatilihing lihim at karaniwang itinatapon pagkatapos ng key generation.
- Pumili ng integer na upang at .
- ibig sabihin, ang at ay dapat na coprime.
- Ang numerong na ito ay bumubuo ng pampublikong key exponent at karaniwang pinipili bilang isang maliit na numero para sa computational na kahusayan.
- Ang prime number na ay madalas na ginagamit.
- Kalkulahin ang upang masiyahan ang congruence relation na .
- Ibig sabihin, ang ay ang multiplicative inverse ng modulo .
- Ito ay mas mahusay na kinakalkula gamit ang extended Euclidean algorithm.
- Ang numerong na ito ay ang pribadong key exponent.
- Ang pampublikong key ay binubuo ng , at ang pribadong key ay .
-
Key distribution:
- Ang pampublikong key ay ginagawang pampubliko para sa mga gustong magpadala ng mensahe
- Ang pribadong key ay pinapanatiling lihim.
-
Encryption:
- Gustong magpadala ni Alice ng mensaheng kay Bob. Sa kasong ito ay isang simpleng integer
- Ginagamit ni Alice ang pampublikong key ni Bob upang i-encrypt ang mensahe bilang ciphertext
Mathematical na detalye
- Ang ay isang integer na .
- , kung saan ang ay ang ciphertext.
-
Decryption:
- Natanggap ni Bob ang ciphertext
- Ginagamit ni Bob ang kanyang pribadong key upang i-decrypt ang mensahe pabalik sa mensaheng
Mathematical na detalye
- .
Ito ang pangunahing balangkas ng RSA. Sa praktiko, mas sopistikadong mga padding scheme ang inilalapat sa plain text na bago ang encryption upang matiyak na ang mga pantay na plain text ay nagresulta sa iba't ibang ciphertext. Pinipigilan nito ang isang hanay ng mga posibleng pag-atake laban sa mga naive na implementasyon ng RSA at nagpapagana ng semantic security.
Ilustrasyon ng RSA sa Pythonβ
Sa mga sumusunod na code cell, ipinapakita natin ang isang simpleng halimbawa ng RSA algorithm gamit ang maliliit na integer, at pagkatapos ay nagpapakita ng praktikal na key distribution at digital signature na mga aplikasyon gamit ang mga Python library na nagpapatupad ng RSA.
Tandaan: Sa seksyong ito, ipapakita natin ang mga kalkulasyong matematikal nang detalyado bilang bahagi ng Python code
Paglikha ng RSA keyβ
Sundan natin ang isang simpleng halimbawa ng RSA algorithm gamit ang maliliit na prime na numero.
Kakailanganin nating makalkula ang greatest common divisor ng dalawang integer, dahil kailangan ito para masuri kung ang dalawang integer ay coprime.
Magpapaliwanag tayo ng isang simpleng paraan para kalkulahin ito, ngunit mas mahusay para sa malalaking integer ang paggamit ng math.gcd na Python function.
# Added by doQumentation β required packages for this notebook
!pip install -q cryptography
import math
# Example function to compute the gcd (greatest common divisor)
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
# let's calculate some examples using algorithm
n1 = gcd(50, 10)
n2 = gcd(99, 33)
n3 = gcd(59, 9)
# do the same with the python library call
m1 = math.gcd(50, 10)
m2 = math.gcd(99, 33)
m3 = math.gcd(59, 9)
# Confirm they are the same
assert n1 == m1
assert n2 == m2
assert n3 == m3
# They are - print out the values for explanation
print("gcd(50,10) =", m1)
print("gcd(99,33) =", m2)
print("gcd(59,9) =", m3)
Ang unang yugto ng RSA workflow ay ang paglikha ng key. Nagsisimula ito sa pagpili ng dalawang prime na numero, na dapat itago ng entity na gumagawa ng mga key.
# Choosing two prime numbers and keep them secret
p = 13
q = 19
print("The secret prime numbers p and q are:", p, q)
Susunod, kinakalkula ang modulus , na simpleng produkto ng dalawang piniling prime. Ang modulus na ito ay ilalathala bilang bahagi ng public key.
# Calculate n which is the modulus for both the public and private keys
n = p * q
print("modulus n (p*q)=", n)
Ang Euler totient function na ay kinakalkula susunod, dahil kailangan ito para sa modular multiplicative inverse na operasyon na ginagamit para matukoy ang mga key sa RSA. Ang ay itinatago rin nang lihim at karaniwang itinatapon pagkatapos ng key generation.
# Compute Euler's totient function, Ο(n) and keep it secret
phi = (p - 1) * (q - 1)
print("The secret Euler's function (totient) [phi(n)]:", phi)
Handa na tayo ngayon na kalkulahin ang mga public at private key. Sa RSA, ang bawat isa sa mga ito ay tinukoy ng tuple ng dalawang integer. Ang unang entry sa bawat tuple ay isang natatanging integer, at ang pangalawang entry ay ang modulus na karaniwan sa parehong key.
Ang unang entry sa public key ay maaaring maging anumang integer na mas malaki sa 1 na coprime sa . Ang dalawang integer ay coprime kung ang kanilang greatest common divisor ay 1. Kaya ginagamit natin ang math.gcd function para mahanap ang integer na coprime sa .
# Choose an integer e such that e and Ο(n) are coprime
e = 2
while e < phi:
if math.gcd(e, phi) == 1:
break
else:
e += 1
print("Public Key (e):", e)
Ang private key ay nangangailangan ng integer , na siyang multiplicative inverse ng modulo ; ibig sabihin, nasasabay ito sa congruency relation na . Para sa simpleng ilustrasyong ito na gumagamit ng maliliit na integer, maaari tayong mag-loop sa mga positibong integer para mahanap ang angkop na . Sa mga realitibong setting, ang computationally efficient na extended Euclidean algorithm ang ginagamit para sa layuning ito.
# Compute a value for d such that (d * e) % Ο(n) = 1
d = 1
while True:
if (d * e) % phi == 1:
break
else:
d += 1
print("Private Key (d):", d)
Binubuo na natin ngayon ang mga tuple , na nagbibigay ng public at private key ayon sa pagkakasunod. Ang public key ay ilalathala, habang ang private key ay itinatago nang lihim.
# Public and Private Key pair
public = (e, n)
private = (d, n)
print(f"The Public key is {public} and Private Key is {private}")
Ang encryption at decryption sa RSA ay gumagamit ng modular exponentiation operation. Bukod dito, ang mga public at private key ay magkakomplemento sa lawak na ang alinman sa mga ito ay maaaring gamitin para i-encrypt ang isang mensahe na maaaring i-decrypt ng isa.
Dito ipinapakita natin ang kaso kung saan ang public key ay ginagamit para sa encryption at ang private key ay ginagamit para sa decryption sa pamamagitan ng pagtukoy ng Python function para sa bawat operasyon.
Pagkatapos ay ine-encrypt at dine-decrypt natin ang isang integer na mensahe .
# Encryption function
def encrypt(plain_text):
return (plain_text**e) % n
# Decryption function
def decrypt(cipher_text):
return (cipher_text**d) % n
# Simple message to encode
msg = 9
# encrypt then decrypt
enc_msg = encrypt(msg)
dec_msg = decrypt(enc_msg)
print("Original Message:", msg)
print("Encrypted Message:", enc_msg)
print("Decrypted Message:", dec_msg)
Habang ang maliliit na integer na ginamit sa itaas ay kapaki-pakinabang para madaling ibalangkas ang mga pangunahing ideya sa RSA algorithm, sa mga tunay na aplikasyon ang RSA ay nangangailangan ng paggamit ng napakalaking integer. Halimbawa, ang 2048-bit RSA ay gumagamit ng modulus na 2048 bits ang haba, na ang katumbas na decimal integer ay humigit-kumulang 10. Ang mga tunay na napakalaking numerong ito ay kinakailangan para sa praktikal na seguridad ng RSA.
Palitan ng symmetric key gamit ang RSAβ
Gaya ng tinalakay nang mas maaga, ang AKC ay nagbibigay-daan sa dalawang partidong gustong makipag-communicate na ligtas na magtatag ng isang shared secret, na maaaring gamitin, halimbawa, bilang secret key para sa kasunod na symmetric encryption ng bulk na plain text.
Isaalang-alang natin ang sumusunod na sitwasyon. Gusto ni Alice at Bob na gumamit ng SKC para mag-encrypt at mag-decrypt ng mga mensahe. Gayunpaman, bago masimula ang prosesong ito, kailangan nilang magkasundo sa isang karaniwang secret key. Isang opsyon ay para sa isang partido β sabihin nating si Alice β na lumikha ng secret key at pagkatapos ay ligtas na ipadala ito kay Bob. Para makamit ang ligtas na paglilipat na ito, nagpasya si Alice na gamitin ang RSA bilang key encapsulation mechanism (KEM).
Kabilang sa prosesong ito ang mga sumusunod na hakbang:
- Una, lumilikha si Alice ng isang random na symmetric key, na balak niyang ibahagi kay Bob.
- Pagkatapos, gumagawa si Bob ng asymmetric key pair at ginagawa ang kanyang public key available sa isang angkop na channel.
- Susunod, ginagamit ni Alice ang public key ni Bob para i-encrypt ang symmetric key, kaya ikinakapsul ito sa isang ciphertext.
- Pagkatapos, ibinabahagi ni Alice ang ciphertext sa isang maaasahang ngunit hindi naman kailangang ligtas na channel.
- Sa wakas, tinatanggap ni Bob ang ciphertext at dine-decrypt ito gamit ang kanyang private key. Mayroon na siyang access sa symmetric key na nilikha ni Alice.

Figure 1. Palitan ng symmetric key gamit ang RSA
Halimbawa ng padding-based na key exchange sa Pythonβ
Isang praktikal na workflow na gumagamit ng RSA para sa padding-based na non-interactive key exchange ay ipinapakita ngayon gamit ang cryptography na Python library.
I-import ang mga kinakailangang module mula sa cryptography na Python library. Kung kinakailangan, ang library na ito ay maaaring i-install gamit ang command na pip install cryptography.
Pagkatapos, lumilikha si Alice ng random na secret key, na balak niyang ipadala kay Bob.
# pip install cryptography
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
symmetric_key = Fernet.generate_key()
print(f"\nSymmetric key generated by Alice: {symmetric_key}")
Gamit ang rsa module mula sa cryptography library, gumagawa si Bob ng key pair at pagkatapos ay ibinabahagi ang kanyang public key. Maaaring mapigilan ng sinuman ang public key at mabasa ang mga public number na bumubuo sa key.
# Bob generates a 2048-bit RSA key pair
bob_private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
bob_public_key = bob_private_key.public_key()
print(f"Public key broadcast by Bob: {bob_public_key}")
print(f"\nPublic numbers in Bobs' public key: {bob_public_key.public_numbers()}")
Sa puntong ito, ipinapalagay nating natanggap ni Alice ang public key na ibinahagi ni Bob. Ang symmetric_key ni Alice sa itaas ay maaari nang i-encrypt gamit ang public key ni Bob para makagawa ng ciphertext. Sa isang realitibong setting, gagamit din si Alice ng karagdagang mga paraan ng padding tulad ng OAEP para matiyak ang semantic security para sa kanyang mga komunikasyon kay Bob.
# Encryption
ciphertext = bob_public_key.encrypt(
symmetric_key,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
print("Ciphertext:", ciphertext)
Ibinabahagi ni Alice ang ciphertext sa isang bukas na channel, tiwala na si Bob lamang na may kaukulang private key ang makakapag-decrypt nito. Ipinapalagay nating natanggap ni Bob ang ciphertext at maaari na itong i-decrypt gamit ang kanyang kumpidensyal na private key.
# Bob decrypts ciphertext to access the symmetric key
decrypted_symmetric_key = bob_private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
print("Decrypted key:", decrypted_symmetric_key)
assert decrypted_symmetric_key == symmetric_key
Sa puntong ito, parehong si Alice at Bob ay may access na sa secret symmetric key, na maaari nilang gamitin para sa mga aplikasyon ng SKC.
Pagsimula ng Key Encapsulation Mechanism gamit ang RSA sa Pythonβ
Sa sumusunod na workflow, ipinapakita natin ang paggamit ng RSA para gayahin ang isang Key Encapsulation Mechanism (KEM) kung saan isang sapat na mahaba random na secret na mensahe ay ligtas na ipinagpapalit at kasunod na kino-convert sa isang shared secret ng angkop na haba gamit ang isang KDF.
Muli, gusto ni Alice at Bob na magtatag ng isang shared secret nang hindi nagta-transact nang direkta, at si Alice ang partido na nagpapasya kung aling secret ang gagamitin.
Nagsisimula tayo sa pag-import ng ilang kinakailangang Python library.
Pagkatapos, gumagawa si Bob ng kanyang RSA key pair at ibinabahagi ang kanyang public key.
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
from os import urandom
# Bob's RSA key pair
private_key_Bob = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key_Bob = private_key_Bob.public_key()
print("Bob's private and public keys created")
Unang gumagawa si Alice ng isang mahabang random na secret mula sa kung saan sa kalaunan ay matatamo ang shared secret. Sa isang purong KEM, ang mahabang secret ay magiging isang random na elemento mula sa algebraic na istruktura na pinagbabatayan ng cryptosystem. Sa kaso ng 2048-bit RSA, ito ay magiging isang random na integer na modulo ng 2048-bit RSA modulus. Dahil ang isang purong KEM ay hindi nangangailangan ng karagdagang padding ngunit sa halimbawang ito ay gina-gaya lamang natin ang isang KEM gamit ang RSA at ang cryptography library ay nangangailangan ng paggamit ng padding kapag nag-e-encrypt gamit ang RSA. Kaya gagamit tayo ng medyo mas maikling mahabang secret na gayunpaman ay mas mahaba pa rin kaysa sa isang karaniwang 256-bit AES key.
Alice_long_secret = urandom(160) # A 160 byte or 1280 bit random message
print("Alice's secret created")
Susunod, ine-encrypt ni Alice ang mahabang secret gamit ang public key ni Bob at ang naka-encrypt na secret ay ipinagpapalit kay Bob.
Alice_encrypted_secret = public_key_Bob.encrypt(
Alice_long_secret,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
print("Alice's secret encrypted")
Dine-decrypt ni Bob ang naka-encrypt na secret na natanggap mula kay Alice gamit ang kanyang private key.
Bob_decrypted_secret = private_key_Bob.decrypt(
Alice_encrypted_secret,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
assert Alice_long_secret == Bob_decrypted_secret, "Secrets do not match!"
# if we get here they match
print("Secrets match")
Sa wakas, parehong si Alice at Bob ay magkahiwalay na nag-aaplay ng napagkasunduang Key Derivation Function (KDF) sa mahabang secret para makuha ang symmetric key.
Tandaan na ang proseso ay kinabibilangan ng isang hashing protocol at ang paggamit ng isang random na salt na tinitiyak ang pagiging natatangi at hindi mahulaan ng shared symmetric key sakaling ang mahabang secret ay muling gamitin (hindi inirerekomenda). Gayunpaman ang salt mismo ay hindi kailangang maging lihim at kapag random itong nagawa, sabihin nating ni Alice sa halimbawang ito, maaari itong ibahagi kay Bob kasabay ng naka-encrypt na mahabang secret.
Ipinapalagay nating parehong si Alice at Bob ay may access sa parehong random na salt.
def key_derivation_function(secret, salt):
hkdf = HKDF(
algorithm=hashes.SHA256(),
length=32, # Desired key length
salt=salt,
info=None,
backend=None,
)
return hkdf.derive(secret)
common_salt = urandom(16) # Random salt accessible to both Alice and Bob
symmetric_key_Alice = key_derivation_function(Alice_long_secret, common_salt)
symmetric_key_Bob = key_derivation_function(Bob_decrypted_secret, common_salt)
assert symmetric_key_Alice == symmetric_key_Bob, "Derived keys do not match!"
print(
f"A symmetric key of length {len(symmetric_key_Alice)*8} bits was successfully derived by both Alice and Bob!"
)
Mga digital signature gamit ang RSAβ
Palawakin na natin ngayon ang sitwasyon ng kumpidensyal na komunikasyon sa pagitan ni Alice at Bob para isama rin ang validation sa tulong ng isang digital signature.
Gaya ng dati, lihim na magpapadala si Alice ng mensahe na naglalaman ng symmetric key kay Bob, ngunit maglalagay din siya ng digital signature sa mensahe para mapatunayan ni Bob, sa pagtanggap ng mensahe, na si Alice ang nagpadala nito at na ang nilalaman ng mensahe ay hindi binago sa panahon ng pagpapadala.
Sa pangkalahatan, kanais-nais na mapagana ang validation nang hindi nakompromiso ang kumpidensyalidad kung saan ang anumang interesadong partido ay may kakayahang i-verify ang integridad, pagiging tunay, at magtayo ng non-repudiation kaugnay ng isang ibinigay na komunikasyon, kahit na ang partidong iyon ay walang access sa aktwal na plain text na mensahe.
Isasaalang-alang natin ang pangkalahatang setting na ito na kinabibilangan ng mga sumusunod na hakbang:
- Una, parehong si Bob at Alice ay ginagawang available ang kanilang mga public key sa isang bukas na channel.
- Pagkatapos, ine-encrypt ni Alice ang plain text gamit ang public key ni Bob, na lumilikha ng isang ciphertext.
- Susunod, gumagawa si Alice ng hash ng ciphertext gamit ang isang hash function at dagdag na ine-encrypt ang nagresultang na-hash na ciphertext gamit ang kanyang private key. Ang naka-encrypt na hash na ito ay ang signature.
- Pagkatapos, ipinapadala ni Alice ang parehong ciphertext at signature sa isang bukas na channel.
- Pagkatapos, ginagamit ni Bob ang public key ni Alice para i-decrypt ang signature, inilalantad ang na-hash na ciphertext.
- Susunod, dahil mayroon ding access si Bob sa ciphertext mismo, ginagamit niya ang parehong hash function na ginamit ni Alice para muling lumikha ng pangalawang instance ng na-hash na ciphertext. Kung ang huli ay tumutugma sa nakuha sa pamamagitan ng pag-decrypt ng signature ni Alice, ang mensahe ay na-validate, kahit na ang ciphertext mismo ay hindi pa na-decrypt.
- Sa wakas, si Bob, na na-validate na ang mensahe, ay dine-decrypt ang ciphertext gamit ang kanyang sariling private key.

Figure 2. Mga digital signature gamit ang RSA
Ang workflow para sa isang digital signature ay ipinapakita sa susunod.
Muli naming ini-import ang ilang kapaki-pakinabang na module mula sa cryptography library. Gaya ng dati, balak ni Alice na ligtas na magpadala ng isang symmetric key kay Bob, ngunit nais din niyang digital na lagdaan ito. Sa kasong ito, kailangan natin ng mga public key para sa parehong si Alice at Bob. Samakatuwid, ang unang hakbang ay para sa parehong si Alice at Bob na lumikha ng kanilang sariling key pair gamit ang RSA at ibahagi ang kanilang sariling public key sa lahat.
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding, rsa
from cryptography.hazmat.primitives.asymmetric.utils import Prehashed
# Generate keys for Bob
bob_private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
bob_public_key = bob_private_key.public_key()
# Generate keys for Alice
alice_private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
alice_public_key = alice_private_key.public_key()
print("Private and Public keys generated for Bob and Alice.")
Sa susunod na hakbang, gaya ng dati, ginagamit ni Alice ang public key ni Bob para i-encrypt ang symmetric key at inihahanda ang ciphertext.
# Alice encrypts the message using Bob's public key
ciphertext = bob_public_key.encrypt(
symmetric_key,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
print("ciphertext of symmetric key: ", ciphertext)
Sa yugtong ito, sa halip na ibahagi lamang ang ciphertext, balak ni Alice na mag-attach ng digital signature dito para mapatunayan niya kay Bob na siya ang nagpadala ng mensahe. Ginagawa ito sa dalawang hakbang:
- Lumikha ng hash ng ciphertext gamit ang isang hashing algorithm.
- I-encrypt ang hash gamit ang private key ni Alice, na katumbas ng isang signature.
# Alice signs the ciphertext using her private key
digest = hashes.Hash(hashes.SHA256())
digest.update(ciphertext)
hash_to_sign = digest.finalize()
signature = alice_private_key.sign(
hash_to_sign,
padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH),
Prehashed(hashes.SHA256()),
)
print("signature: ", signature)
Ibinahagi ni Alice ang ciphertext at signature sa isang network para matanggap ni Bob ang pareho sa kanila.
# Bob receives the ciphertext and signature
received_ciphertext = ciphertext
received_signature = signature
# Send signature and ciphertext here
print("Sending ciphertext and signature.....")
Sa panig ni Bob, ang unang gawain ay i-verify ang integridad at pagiging tunay ng ciphertext. Para gawin ito, gumagawa si Bob ng hash ng natanggap na ciphertext gamit ang parehong hashing algorithm na ginamit ni Alice.
# Bob creates a hash of the ciphertext using the same algorithm used by Alice
digest = hashes.Hash(hashes.SHA256())
digest.update(received_ciphertext)
hash_to_verify = digest.finalize()
print("hash to verify: ", hash_to_verify)
Pagkatapos, dine-decrypt ni Bob ang natanggap na signature gamit ang public key ni Alice. Dahil ginamit ni Alice ang kanyang private key para gumawa ng signature, nagagawa ni Bob na i-decrypt ito gamit ang public key ni Alice. Ang na-decrypt na signature ay wala nang iba kundi isang hash ng ciphertext na ginawa sa panig ni Alice. Kung ang hash na ginawa ni Bob ay tumutugma sa na-decrypt na signature, napatunayan ni Bob na ang ciphertext na natanggap niya ay hindi binago at si Alice ang naglagda ng ciphertext.
Sa Python code sa ibaba, ang mga operasyong ito ay pinagsama sa isang kapaki-pakinabang na utility function na tinatawag na verify na ibinibigay ng isang object na nauugnay sa public key ni Alice.
from cryptography.exceptions import InvalidSignature
def is_signature_valid(public_key, signature, data_hash):
try:
public_key.verify(
signature,
data_hash,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH
),
Prehashed(hashes.SHA256()),
)
return True
except InvalidSignature:
return False
if is_signature_valid(alice_public_key, received_signature, hash_to_verify):
print("The signature is valid.")
else:
print("The signature is not valid.")
Pagkatapos ma-verify ang integridad at pagiging tunay ng natanggap na ciphertext, maaari na si Bob na i-decrypt ito gamit ang kanyang private key dahil nilikha ni Alice ang ciphertext gamit ang public key ni Bob.
# Bob decrypts the message using his private key
decrypted_message = bob_private_key.decrypt(
received_ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
print("Decrypted message:", decrypted_message.decode())
Sa sitwasyon ng digital signature sa itaas, anumang partido β hindi lamang si Bob β ay makakapag-verify na si Alice ang nagpadala ng ciphertext dahil maaaring ma-access ng lahat ang public key ni Alice, ang ciphertext, at ang digital signature. Bukod pa rito, pagkatapos ipadala ang ciphertext at ang signature, hindi na maaaring itanggi ni Alice na ginawa niya ito dahil ang signature ay maaaring ma-decrypt sa isang makahulugang hash gamit ang kanyang public key lamang. Itinatayo nito ang non-repudiation.
Sa pamamagitan ng pagpapagana ng ligtas na pamamahagi ng key at pagsuporta sa non-repudiation, ang public key cryptography ay nagtatayo ng matibay na pundasyon para sa ligtas na digital na komunikasyon.
Pagsira ng RSAβ
Ang pagiging kapaki-pakinabang at seguridad ng RSA algorithm na nakabalangkas sa itaas ay nakasalalay sa dalawang matematikal na pagpapalagay:
-
Ang paghanap ng modular multiplicative inverse kung ang tanging access lamang ay sa ay hindi magagawa sa makatwirang oras ng kompyutasyon.
-
Sa konteksto ng RSA, ang operasyon ng modular exponentiation ay kumikilos tulad ng isang one-way trapdoor function. Kapag ginamit para sa encryption, nagbubunga ito ng ciphertext na hindi mababasa, at nang wala ang access sa private key, ang pag-invert ng operasyon para mabawi ang plain text mula sa ciphertext ay hindi magagawa. Gayunpaman, kapag may access sa private key na gumaganap bilang trapdoor, madaling ma-decrypt ang ciphertext.
Ang pinaka-kilalang pag-atake sa RSA algorithm ay naglalayong sirain ang pagpapalagay 1 sa pamamagitan ng mahusay na pagbawi ng private key number sa pamamagitan ng factorization ng modulus . Tulad ng mailalatag sa ibaba, madaling mabawi ang kung may access ang isa sa prime factors at ng o sa totient . Alalahanin na ang , , at ay pinananatiling lihim sa panahon ng key generation at tinatanggal pagkatapos. Ang isang third party na nakakabawi ng impormasyong ito gamit ang isang klasikal o quantum na kompyuter ay mahalagang natuklasan ang private key, na sinisira ang RSA. Kaya naman, ang prime factorization ang pangunahing computational primitive na kailangan para sirain ang RSA.
Klasikal na computing at RSAβ
Ang prime factorization ng malalaking integer ay kilala na nagpapakita ng super-polynomial o subexponential na scaling sa mga klasikal na kompyuter. Ang pinaka-kilalang klasikal na algorithm para sa factoring ng mga integer na mas malaki sa ay ang general number field sieve (GNFS)
Matematikal na detalye
bilang function ng integer na ifa-factor.
Ang scaling na ito ay super-polynomial sa bilang ng mga bit na kailangan para katawanin ang .
Samakatuwid, ang prime factorization ay itinuturing na hindi mahusay sa mga klasikal na kompyuter.
Sa kasalukuyan, ang pinakamalalaking integer na na-factor sa klasikal na hardware ay nasa hanay na 829 bits o 250 decimal na digit. Dahil sa exponential na paglago ng kapangyarihan ng klasikal na computing na nasaksihan sa nakaraang ilang dekada, ang 1024-bit RSA ay hindi na itinuturing na secure sa malapit na hinaharap at na-deprecate na. Gayunpaman, sa nakikitang hinaharap, ang pag-factor ng 2048-bit na mga integer na ang magnitude ay nasa hanay ng ay kasalukuyang itinuturing na hindi magagawa sa mga klasikal na sistema, na nagpapahiwatig ng patuloy na pagiging viable. Ang pagdating ng mga quantum na kompyuter, gayunpaman, ay nagpapawalang-bisa ng pagtatasa na ito.
Shor's quantum algorithm at RSAβ
Marahil ang pinaka-kilalang quantum algorithm ngayon ay ang Shor's algorithm para sa paghanap ng mga prime factor ng mga integer. Nang ipakilala ni Peter Shor noong 1994, kinikilala ito bilang unang quantum algorithm na nag-aalok ng super-polynomial na speedup kumpara sa mga klasikal na algorithm sa isang problemang may malaking praktikal na kahalagahan, lalo na ang prime factorization.
Ang Shor's algorithm ay maaaring mag-factor ng mga prime gamit ang kung saan ang ay ang bilang ng mga bit.
Matematikal na paliwanag ng Shor's algorithm
Sa konteksto ng RSA, ang Shor's algorithm ay gumagana sa pamamagitan ng pagsasamantala sa periodicity ng modular exponential function at nagbibigay ng quantum period-finding primitive na nagbibigay-daan sa mahusay na prime factorization ng modulus .
Ang isang simplified na mataas na antas na balangkas ng pangkalahatang scheme ni Shor para sa pagsira ng RSA ay ang mga sumusunod:
-
Dahil sa modulus , na inilathala bilang bahagi ng public key, pumili ng isang numero na coprime sa , ibig sabihin, . Dahil alam natin na ang ay may eksaktong dalawang prime factor , halos kahit anong numero na mas mababa sa na ating napili nang random ay malamang na coprime sa .
-
Pagkatapos mapili ang , hanapin ang exponent na . Ipinahihiwatig nito na . Ang pagkakaroon ng isang exponent na natutugunan ang congruence sa itaas ay ginagarantiyahan ng periodicity property ng modular exponentiation.
-
Kung ang ay pantay, para sa ilang integer . Ang kaliwang bahagi ng huli na pagkakatumbas na ito ay dapat naglalaman ng at bilang dalawa sa mga prime factor nito dahil ganoon ang kanang bahagi. Kung ang ay kakaiba, bumalik sa hakbang 1 at subukan ang ibang pagpipilian para sa .
-
Gamitin ang extended Euclid algorithm para sa paghanap ng o . Ang kinakalkula na GCD ay malamang na makilala ang isa sa mga prime factor o . Hatiin ang gamit ang prime factor na ito para mabawi ang isa pa.
-
Kapag nakilala na ang , gamitin ang mga hakbang mula sa orihinal na RSA algorithm para muling buuin ang totient at buuin ang private key number bilang modular inverse ng kilalang public key number .
Noong Agosto 2023, nag-publish si Oded Regev ng isang pagpapabuti sa orihinal ni Shor gamit ang isang multi-dimensional na diskarte na nagresulta sa . Patuloy pa rin ang karagdagang pananaliksik kabilang na ang ginagawa nina Ragavan at Vaikuntanathan sa larangang ito na maaaring magpabuti ng oras, gastos, o bilang ng mga qubit na kailangan. Bagama't hindi natin masasabi kung kailan talagang magiging viable ang pagpapatakbo ng ganitong mga algorithm laban sa tunay na RSA encryption, lalo itong naglalapitan sa atin.
Halimbawa sa Python na nagpapakita ng pagsira ng RSA encryptionβ
Sa mga sumusunod na code cell, naglarawan tayo ng halimbawa ng paghanap ng isang private key habang binibigyan lamang ng public key. Gagamitin nito ang brute-force na klasikal na kompyutasyon, ngunit ipinapakita kung paano maaaring gamitin ang Shor's algorithm β kabilang ang malalaking key.
Sa seksyong ito, ipapakita natin ang mga matematikal na kalkulasyon nang detalyado bilang bahagi ng Python code
Sa halimbawa, mayroon tayong public key , at mabawi natin ang private key.
Hakbang 1: Ang unang hakbang ay pumili ng isang numero na coprime sa 247. Halos kahit anong numero na ating hulaan ay gagawin ang trabaho. Pumili tayo ng 6.
n = 247 # the modulus
e = 5 # public key number
a = 6 # an integer coprime to n
assert gcd(a, n) == 1
print(f"Checked {n} and {a} are coprime")
Hakbang 2: Susunod, kailangan nating hanapin ang period na . Sa halimbawang ito, kinakalkula natin ang nang klasikal gamit ang brute force, ngunit maaari rin tayong gumamit ng Shor's algorithm sa isang quantum na kompyuter gamit ang Qiskit.
r = 0
rem = 100
while rem != 1:
r += 1
rem = (a**r) % n
print(f"period r is: {r}")
assert a**r % n == 1
print(f"Checked {a}^{r} mod {n} is 1")
Hakbang 3: Dahil ang period ay pantay, maaari tayong mag-compute ng .
# explicitly use as integer
f1 = int(a ** (r / 2) - 1)
f2 = int(a ** (r / 2) + 1)
print(f"f1 = {f1}")
print(f"f2 = {f2}")
Hakbang 4: Hanapin ang GCD ng alinman sa mga factor na iyon gamit ang . Hatiin lamang ang gamit ang prime factor na nahanap na para makuha ang pangalawang prime factor.
q_found = gcd(f1, n)
print(f"One possible prime factor of n ({n}) is: {q_found}")
# explicit int (to avoid floating point)
p_found = int(n / q_found)
print(f"The second prime factor of n ({n}) is: {p_found}")
assert n == p_found * q_found
Hakbang 5: Pagkatapos mabawi ang mga prime factor ng bilang at , kinakalkula natin ang totient .
Ang private key ay ang modular inverse ng public key number .
# Compute the totient
phi_found = (p_found - 1) * (q_found - 1)
print(f"The totient is: {phi_found}")
# Recover the private key number d_found by satisfying (d_found * e) % phi_found = 1
d_found = 1
while True:
if (d_found * e) % phi_found == 1:
break
else:
d_found += 1
print("Private Key number:", d_found)
Sa scheme sa itaas, ang hakbang 2 ang mahalagang operasyon ng period-finding kung saan ginagamit ng Shor's algorithm ang dalawang pangunahing quantum primitive, lalo na ang quantum Fourier transform at quantum phase estimation. Para sa detalyadong paliwanag ng mga quantum aspeto ng Shor's algorithm, tingnan ang aralin na Phase estimation and factoring sa Fundamentals of Quantum Algorithms. Ang mga hakbang 1 at 3 hanggang 5 ay nagsasangkot ng mga operasyong medyo hindi mahal na madaling maisagawa sa mga klasikal na kompyuter.
Opsyonal, narito ang isang detalyadong visual na walkthrough ng pagpapatupad ng Shor's algorithm.
Sa mga quantum na kompyuter, ang Shor's algorithm ay maaaring magpakita ng polylogarithmic scaling na kasingabuti ng sa mga tuntunin ng modulus , o polynomial scaling sa mga tuntunin ng bilang ng mga bit na kailangan para katawanin ang . Ito ay isang super-polynomial na speedup kumpara sa klasikal na GNFS algorithm.
Ang mga kamakailang tantya ng resources ay nagpapahiwatig na batay sa ilang mga pagpapalagay na ginawa tungkol sa configuration ng hardware, ilang sampung libo hanggang ilang milyong qubit ang kailangan para sirain ang 2048-bit RSA gamit ang Shor's algorithm. Hindi imposible na ang mga quantum na kompyuter na may ilang sampung libong qubit ay magiging available sa susunod na ilang taon, na ginagawang accessible ang pinakamababang dulo ng tantya ng resources.
Diffie-Hellman key exchange at ang Digital Signature Algorithmβ
Sa nakaraang seksyon, tinalakay natin ang RSA cryptosystem, na ang seguridad ay batay sa computational na kahirapan ng prime factorization. Dito, tatalakayin natin ang dalawang sikat na asymmetric key cryptographic protocol, ang Diffie-Hellman key exchange (DH) at ang Digital Signature Algorithm (DSA), na parehong batay sa ibang matematikal na problema, lalo na ang discrete logarithm problem (DLP).
Ang discrete logarithm problemβ
Sa sumusunod na equation kailangan nating hanapin ang dahil sa , , lamang
Ito ay pinaniniwalaan na mahirap sa mga klasikal na kompyuter dahil sa paggamit ng modulo arithmetic, at samakatuwid ay isang magandang matematikal na pundasyon para sa isang encryption algorithm.
Ito ay kilala bilang ang discrete logarithm problem (DLP).
Matematikal na detalye ng discrete logarithm problemβ
Ang DLP ay karaniwang nakabalangkas sa konteksto ng mga cyclic group at isinasaad tulad ng sumusunod.
Isaalang-alang ang isang cyclic group na nabuo ng isang group element at dahil sa isang arbitrary na elemento , hanapin ang isang integer na .
Dito ang integer ay ang discrete logarithm. Ang cyclic property ng ay ginagarantiyahan na para sa bawat , may valid na integer na umiiral.
Para sa cryptography, ang DLP sa multiplicative group ng mga integer modulo ang isang prime number na tinutukoy bilang ay nagpapatunay na kapaki-pakinabang. Ang mga elemento ng ay mga congruence class na may label ng mga integer modulo na coprime sa .
Halimbawa:
Ang operasyon ng multiplication sa mga group na ito ay simpleng ordinaryong integer multiplication na sinusundan ng reduction modulo at ang exponentiation ng isang integer ay paulit-ulit na multiplication ng na beses at reduction modulo .
Ilarawan natin ang isang instance ng DLP sa .
Ang multiplicative group na ito ay may dalawang generator na na kilala rin bilang primitive roots. Gagamitin natin ang bilang generator; iyon ay, bubuuin ang bawat elemento ng gamit ang magkakasunod na integer powers ng 5.
#Generate elements of (Z_7)^{x} using generator [5].
g = 5
p = 7
print(f"Using generator {g}")
for k in range(3*p):
print(f"{g}**{k} mod {p} β‘ {(g**k)%7}")
Nakita natin na sa modulo 7 arithmetic, ang pagdadala ng 5 sa magkakasunod na integer powers ay nagbubunga ng bawat elemento ng nang eksakto isang beses bago paulit-ulit ang cycle nang walang katiyakan na may period na .
Kaya ang DLP sa na may generator [5] ay:
.
Mula sa output ng Python cell sa itaas, nakita natin na: