RSA-algoritmi – mitä se on ja miten se toimii

RSA-algoritmi selitetty selkeästi: miten julkinen ja yksityinen avain toimivat, miksi alkutekijöinti takaa turvallisuuden ja miten salaus purkautuu.

Tekijä: Leandro Alegsa

RSA (Rivest-Shamir-Adleman) on algoritmi, jota nykyaikaiset tietokoneet käyttävät viestien salaamiseen ja purkamiseen. Se on epäsymmetrinen salausalgoritmi. Epäsymmetrinen tarkoittaa, että on olemassa kaksi eri avainta. Tätä kutsutaan myös julkisen avaimen salaukseksi, koska toinen avaimista voidaan antaa kenelle tahansa. Toinen avain on pidettävä salassa. Algoritmi perustuu siihen, että suuren yhdistetyn luvun tekijöiden löytäminen on vaikeaa: kun tekijät ovat alkulukuja, ongelmaa kutsutaan alkutekijöinniksi. Se on myös avainparin (julkisen ja yksityisen avaimen) generaattori.

RSA:ssa käytetään julkista ja yksityistä avainta. Julkinen avain voi olla kaikkien tiedossa - sitä käytetään viestien salaamiseen. Julkisella avaimella salatut viestit voidaan purkaa vain yksityisellä avaimella. Yksityinen avain on pidettävä salassa. Yksityisen avaimen laskeminen julkisesta avaimesta on hyvin vaikeaa.

Miten RSA toimii – perusvaiheet

RSA:n toiminta voidaan jakaa kolmeen päävaiheeseen: avainten luominen, salaus ja purku.

  • Avainten luominen
    1. Valitaan kaksi suurta satunnaista alkulukua p ja q.
    2. Lasketaan n = p × q. Tämä n on osa sekä julkisesta että yksityisestä avaimesta.
    3. Lasketaan φ(n) = (p − 1) × (q − 1) (joskus merkitään myös φ tai lambda). Tämä luku liittyy p:n ja q:n rakenteeseen.
    4. Valitaan eksponentti e siten, että 1 < e < φ(n) ja e on suhteellisesti alkuluku φ(n):n kanssa (eli gcd(e, φ(n)) = 1). e on osa julkista avainta.
    5. Lasketaan d, joka on e:n käänteisluku modulo φ(n): d × e ≡ 1 (mod φ(n)). d on yksityisen avaimen eksponentti.
    6. Julkinen avain on (n, e) ja yksityinen avain on (n, d).
  • Salaus

    Kun halutaan salata viesti m (esimerkiksi ennen lähettämistä), viesti muunnetaan ensin kokonaisluvuksi m, jossa 0 ≤ m < n (käytännössä viesti ensin täytetään/padataan turvallisesti). Salattu teksti c lasketaan kaavalla:

    c ≡ me (mod n)

  • Purku

    Yksityisellä avaimella purku tehdään kaavalla:

    m ≡ cd (mod n)

    Tämä palauttaa alkuperäisen m:n (olettaen, että padding on hoidettu oikein).

Yksinkertainen esimerkki

Yksinkertaistettu ja yleisesti käytetty opetusesimerkki:

  • Valitaan p = 61 ja q = 53 → n = 3233
  • φ(n) = (61 − 1)(53 − 1) = 3120
  • Valitaan e = 17 (gcd(17, 3120) = 1)
  • Lasketaan d = 2753, koska 17 × 2753 ≡ 1 (mod 3120)
  • Julkinen avain = (3233, 17), yksityinen avain = (3233, 2753)
  • Salataan m = 65: c = 6517 mod 3233 = 2790
  • Purkua varten m = 27902753 mod 3233 = 65

Turvallisuus ja käytännön varoitukset

  • Faktoroinnin vaikeus: RSA:n turvallisuus perustuu siihen, että on laskennallisesti vaikea löytää p:tä ja q:ta, kun ainoastaan n tunnetaan. Jos n pystytään faktoroimaan, yksityinen avain saadaan helposti.
  • Avaimen koko: Nykyään suositellaan vähintään 2048‑bitin avaimia tavalliseen käyttöön. Pitkäaikaisessa tai korkeassa turvallisuusvaatimuksessa käytetään 3072 tai 4096 bittiä.
  • Padding: Pelkkä matemaattinen me mod n ei ole riittävä käytännössä. Turvallinen toteutus käyttää padding‑kaavoja kuten OAEP salaukseen ja RSASSA‑PSS allekirjoituksiin. Ilman asianmukaista paddingia RSA altistuu monille hyökkäyksille (esim. valittu selteksti‑hyökkäykset).
  • Algoritmi ei ole jatkuvasti turvallinen tulevaisuudessa: Kvanttitietokoneet voisivat suorittaa Shorin algoritmin, joka murtaisi RSA:n tehokkaasti. Tämän vuoksi tutkitaan ja otetaan käyttöön post‑kvanttisia algoritmeja.
  • Hyökkäysvektorit: Huonot satunnaislähteet avainten generoinnissa, pienet e‑arvot ilman asianmukaista täyttöä ja sivukanava‑hyökkäykset ovat yleisiä riskitekijöitä.

Käyttötapaukset

  • Salaus: RSA voi salata pienen määrän dataa tai yleensä symmetrisen avaimen (avaimen salaaminen), jota käytetään varsinaisen viestiliikenteen salaamiseen.
  • Allekirjoitukset: RSA:lla tehdään digitaalisia allekirjoituksia (esim. PKCS#1 standardit) varmistaen viestin eheys ja allekirjoittajan aitous.
  • Avainvaihto ja todennus: RSA oli pitkään yleinen menetelmä TLS/Y.509‑sertifikaateissa ja monissa PKI‑järjestelmissä.

Hyödyt ja rajoitukset

  • Hyödyt: Mahdollistaa salauksen ilman, että lähettäjien tarvitsee jakaa salaista avainta etukäteen; tukee allekirjoituksia ja todennusta.
  • Rajoitukset: Hitaampi kuin symmetriset algoritmit, vaatii suurempia avaimia samasta turvallisuustasosta; riippuvainen hyvistä satunnaislähteistä ja oikein toteutetusta paddingista.

Yhteenveto

RSA on yksi tunnetuimmista julkisen avaimen salaustekniikoista ja sitä käytetään laajasti edelleen monissa turvallisuusprotokollissa. Sen perusta on helpon laskun ja vaikean käänteisen ongelman yhdistelmä: kertominen on helppoa, faktorisointi vaikeaa. Käytännössä RSA toimii parhaiten yhdessä muiden menetelmien (esim. symmetrisen salauksen ja turvallisen paddingin) kanssa, ja sen tulevaisuus riippuu osaltaan kvanttilaskennan kehityksestä.

Käytetyt käsitteet

RSA käyttää useita kryptografian käsitteitä:

  • Yksisuuntainen funktio, joka on helppo laskea; sen kumoavan funktion löytäminen tai laskeminen on hyvin vaikeaa.
  • RSA käyttää käsitettä nimeltä diskreetti logaritmi. Se toimii aivan kuten normaali logaritmi: Erona on se, että käytetään vain kokonaislukuja, ja yleensä kyseessä on moduulioperaatio. Esimerkkinä ax =b, modulo n. Diskreetissä logaritmissa on kyse pienimmän x:n löytämisestä, joka täyttää yhtälön, kun a b ja n annetaan
  • Shorin algoritmi voi mahdollisesti torjua sen.


 

Avainten luominen

RSA-algoritmin avaimet luodaan seuraavasti:

  1. Valitse kaksi erilaista suurta satunnaista alkulukua {\displaystyle p} ja q . Tämä on pidettävä salassa.
  2. Laske {\displaystyle n=pq}
    • n on julkisen ja yksityisen avaimen moduuli.
  3. Lasketaan totientti: {\displaystyle \phi (n)=(p-1)(q-1)} .
  4. Valitaan sellainen kokonaisluku {\displaystyle e} , että {\displaystyle 1<e<\phi (n)} , ja {\displaystyle e} on co-primus {\displaystyle \phi (n)} kanssa.
    Toisin sanoen:
    {\displaystyle e} ja {\displaystyle \phi (n)} eivät jaa muita tekijöitä kuin {\displaystyle 1}: {\displaystyle \gcd(e,\phi (n))=1} ; Katso suurin yhteinen jakaja.
    • {\displaystyle e} vapautetaan julkisen avaimen eksponentiksi.
  5. Lasketaan {\displaystyle d} täyttämään kongruenssisuhde {\displaystyle de\equiv 1\!\!\!\!{\pmod {\phi (n)}}} .
    Eli:
    {\displaystyle de=1+x\cdot \phi (n)} jollekin kokonaisluvulle x . (Yksinkertaisesti sanottuna: Lasketaan {\displaystyle d=(1+x\cdot \phi (n))/e} kokonaisluvuksi).
    • {\displaystyle d} pidetään yksityisen avaimen eksponenttina.

Huomautuksia edellä mainituista vaiheista:

  • Vaihe 1: Luvuille voidaan tehdä todennäköisyystestit alkulukujen ensisijaisuuden varalta.
  • Vaihe 3: muutettu PKCS#1 v2.0:ssa muotoon {\displaystyle \lambda (n)={\rm {lcm}}(p-1,q-1)} {\displaystyle \phi (n)=(p-1)(q-1)} sijaan.
  • Vaihe 4: Suosittu valinta julkisten eksponenttien arvoksi on {\displaystyle e=2^{16}+1=65537} . Joissakin sovelluksissa valitaan pienempiä arvoja, kuten {\displaystyle e=3}, {\displaystyle 5}tai {\displaystyle 35} sijaan. Tämä tehdään, jotta salaus ja allekirjoituksen todentaminen olisi nopeampaa pienissä laitteissa, kuten älykorteissa, mutta pienet julkiset eksponentit voivat johtaa suurempiin tietoturvariskeihin.
  • Vaiheet 4 ja 5 voidaan suorittaa laajennetulla euklidisella algoritmilla [fi]; katso modulaarinen aritmetiikka.

 Julkinen avain muodostuu moduulista {\displaystyle n\,} ja julkisesta (tai salaus)eksponentista {\displaystyle e\,} . Henkilökohtainen avain muodostuu p,q:sta ja yksityisestä (tai salauksen purku-) eksponentista {\displaystyle d\,} , joka on pidettävä salassa.

  • Tehokkuuden vuoksi yksityinen avain voidaan tallentaa eri muodossa:
    • {\displaystyle p} ja q : avainten luomisessa käytetyt alkuluvut;
    • {\displaystyle d{\bmod {(}}p-1)} ja {\displaystyle d{\bmod {(}}q-1)} : kutsutaan usein dmp1 ja dmq1;
    • {\displaystyle q^{-1}{\bmod {p}}} : kutsutaan usein iqmp:ksi.
  • Kaikki yksityisen avaimen osat on pidettävä salassa tässä muodossa. {\displaystyle p\,} ja {\displaystyle q\,} ovat arkaluonteisia, koska ne ovat {\displaystyle n\,} kertoimia ja mahdollistavat {\displaystyle d\,} laskennan, kun {\displaystyle e\,} on annettu. Jos {\displaystyle p\,} ja {\displaystyle q\,} eivät ole tallennettu tähän yksityisen avaimen muotoon, ne poistetaan turvallisesti yhdessä muiden avaimen luomisesta peräisin olevien väliarvojen kanssa.
  • Vaikka tämä muoto mahdollistaa nopeamman salauksen purkamisen ja allekirjoittamisen CRT-lausekkeen (Chinese Remainder Theorem) avulla, se on huomattavasti vähemmän turvallinen, koska se mahdollistaa sivukanavahyökkäykset [fi]. Tämä on erityinen ongelma, jos se toteutetaan älykorteissa, jotka hyötyvät eniten tehokkuuden parantumisesta. 
    (Aloita
    {\displaystyle y\equiv x^{e}\!\!\!\!{\pmod {n}}}ja anna kortin purkaa se. Se laskee siis {\displaystyle (y^{d}{\bmod {p}})} tai {\displaystyle (y^{d}{\bmod {q}})}, joiden tulokset antavat jonkin arvon {\displaystyle z} . Aiheutetaan nyt virhe jossakin laskutoimituksessa. Silloin {\displaystyle \gcd(z-x,n)} paljastaa {\displaystyle p} tai q .) .)


 

Viestin salaus

Alice antaa julkisen avaimensa {\displaystyle (n,e)} Bobille ja pitää yksityisen avaimensa salassa. Bob haluaa lähettää viestin {\displaystyle M} Alicelle.

Ensin hän muuttaa {\displaystyle M} luvuksi m , joka on pienempi kuin n , käyttämällä sovittua palautuvaa protokollaa, jota kutsutaan pehmustusjärjestelmäksi. Tämän jälkeen hän laskee salatekstin {\displaystyle c\,} , joka vastaa:

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

Tämä voidaan tehdä nopeasti käyttämällä menetelmää, jossa potenssi saadaan neliöimällä. Tämän jälkeen Bob lähettää Alicelle {\displaystyle c\,}



 

Viestin purkaminen

Liisa voi palauttaa {\displaystyle m\,} {\displaystyle c\,} käyttämällä yksityistä avainta {\displaystyle d\,} seuraavalla tavalla:

Kun on annettu {\displaystyle m\,} , hän voi palauttaa alkuperäiset erilliset alkuluvut, ja soveltamalla kiinalaista jäännöslausetta näihin kahteen kongruenssiin saadaan seuraavat tulokset.

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

Niinpä,

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

Siksi:

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

Toimiva esimerkki

Tässä on esimerkki RSA-salauksesta ja -purusta. Tässä käytetyt alkuluvut ovat liian pieniä, jotta voimme salata mitään turvallisesti. Voit käyttää OpenSSL:ää oikean avainparin luomiseen ja tutkimiseen.

1. Valitse kaksi satunnaista alkulukua {\displaystyle p} ja {\displaystyle q\,}

{\displaystyle p=61} ja {\displaystyle q=53\,}

2. Lasketaan {\displaystyle n=pq\,}

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

3. Lasketaan totientti {\displaystyle \phi (n)=(p-1)(q-1)}

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

4. Valitse {\displaystyle e>1} coprime kuin {\displaystyle 3120\,}

{\displaystyle e=17\,} ;

5. Valitse {\displaystyle d\,} siten, että {\displaystyle ed\equiv 1{\bmod {\phi (n)}}}

{\displaystyle d=2753\,} , jolloin {\displaystyle 17\times 2753=46801=1+15\times 3120} .

 Julkinen avain on ( {\displaystyle n=3233} , {\displaystyle e=17} ). Täytetylle viestille {\displaystyle m\,} salausfunktio {\displaystyle c=m^{e}{\bmod {n}}} muuttuu:

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

Yksityinen avain on ( {\displaystyle n=3233} , {\displaystyle d=2753} ). Salausfunktio {\displaystyle m=c^{d}{\bmod {n}}} muuttuu:

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


 Esimerkiksi
salataksesi {\displaystyle m=123}lasketaan

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

Salaus {\displaystyle c=855}lasketaan

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

Molemmat näistä laskutoimituksista voidaan laskea nopeasti ja helposti käyttämällä modulaarisen potensoinnin neliö- ja moninkertaistamisalgoritmia.



 

RSA-yhtälön johtaminen Eulerin lauseesta

RSA voidaan helposti johtaa Eulerin lauseen ja Eulerin totienttifunktion avulla.

Aloitetaan Eulerin lauseesta,

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

meidän on osoitettava, että salauksen purkaminen oikealla avaimella antaa alkuperäisen viestin. Kun otetaan huomioon pehmustettu viesti m, salausteksti c lasketaan seuraavasti

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

Kun tämä korvataan salauksen purkualgoritmilla, saadaan seuraava tulos

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

Haluamme osoittaa, että tämä arvo on myös yhteneväinen m:n kanssa. e:n ja d:n arvot valittiin siten, että ne täyttävät,

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

Toisin sanoen, on olemassa jokin kokonaisluku k, jonka avulla

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

Nyt korvaamme salatun ja sitten puretun viestin,

{\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}}}

Sovellamme Eulerin teoreemaa ja saamme tuloksen.

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



 

Pehmustejärjestelmät

Käytännössä RSA:ta käytettäessä siihen on yhdistettävä jonkinlainen pehmustejärjestelmä, jotta mikään M:n arvo ei johda turvattomaan salaustekstiin. Ilman pehmustusta käytetyllä RSA:lla voi olla joitakin ongelmia:

  • Arvot m = 0 tai m = 1 tuottavat aina salaustekstejä, jotka ovat vastaavasti 0 tai 1, eksponentiaalisuuden ominaisuuksien vuoksi.
  • Kun salaus tehdään pienillä salauseksponenteilla (esim. e = 3) ja pienillä m:n arvoilla, (ei-modulaarinen) tulos {\displaystyle m^{e}} voi olla tiukasti pienempi kuin moduuli n. Tällöin salaustekstit voidaan helposti purkaa ottamalla salaustekstin eet-juuresta moduulista välittämättä.
  • RSA-salaus on deterministinen salausalgoritmi. Siinä ei ole satunnaiskomponenttia. Sen vuoksi hyökkääjä voi onnistuneesti käynnistää salausjärjestelmää vastaan valitun selkotekstin hyökkäyksen. Hän voi luoda sanakirjan salaamalla todennäköisiä salatekstejä julkisella avaimella ja tallentamalla tuloksena saadut salatekstit. Hyökkääjä voi sitten tarkkailla viestintäkanavaa. Heti kun hän näkee salakirjoitustekstejä, jotka vastaavat hänen sanakirjassaan olevia salakirjoitustekstejä, hyökkääjät voivat käyttää tätä sanakirjaa saadakseen selville viestin sisällön.

Käytännössä kaksi ensimmäistä ongelmaa voi syntyä, kun lähetetään lyhyitä ASCII-viestejä. Tällaisissa viesteissä m voi olla yhden tai useamman ASCII-koodatun merkin ketjutus. Viesti, joka koostuu yhdestä ASCII-merkistä NUL (jonka numeerinen arvo on 0), koodataan muotoon m = 0, jolloin salatun tekstin arvo on 0 riippumatta siitä, mitä e:n ja N:n arvoja käytetään. Vastaavasti yksittäinen ASCII SOH (jonka numeerinen arvo on 1) tuottaisi aina salaustekstin, jonka arvo on 1. Järjestelmissä, joissa käytetään tavanomaisesti pieniä e:n arvoja, kuten 3, kaikki yksittäiset ASCII-merkkiset viestit, jotka on koodattu tätä järjestelmää käyttäen, eivät olisi turvallisia, koska suurimman m:n arvo olisi 255, ja 2553 on pienempi kuin mikä tahansa järkevä moduuli. Tällaiset salatekstit voitaisiin palauttaa yksinkertaisesti ottamalla salatekstin kuutiojuuri.

Näiden ongelmien välttämiseksi käytännön RSA-toteutukset tyypillisesti upottavat jonkinlaisen strukturoidun, satunnaistetun täytteen arvoon m ennen sen salaamista. Tämä pehmuste varmistaa, että m ei kuulu turvattomien salatekstien joukkoon ja että tietty viesti, kun se on täytetty, salataan joksikin monista erilaisista mahdollisista salateksteistä. Jälkimmäinen ominaisuus voi nostaa sanakirjahyökkäyksen kustannukset yli kohtuullisen hyökkääjän kykyjen.

PKCS:n kaltaiset standardit on suunniteltu huolellisesti täyttämään viestit turvallisesti ennen RSA-salausta. Koska näissä järjestelmissä selkotekstiä m täydennetään jollakin määrällä ylimääräisiä bittejä, täydennyksettömän viestin M koon on oltava jonkin verran pienempi. RSA-pehmustejärjestelmät on suunniteltava huolellisesti, jotta voidaan estää monimutkaiset hyökkäykset. Tätä voidaan helpottaa ennustettavalla viestin rakenteella. PKCS-standardin varhaisissa versioissa käytettiin ad hoc -rakenteita, jotka myöhemmin havaittiin haavoittuviksi käytännölliselle mukautuvalle valittuun salaustekstiin kohdistuvalle hyökkäykselle. Nykyaikaisissa rakenteissa käytetään turvallisia tekniikoita, kuten optimaalista epäsymmetristä salauspehmustetta (OAEP), viestien suojaamiseksi ja näiden hyökkäysten estämiseksi. PKCS-standardissa on myös käsittelyjärjestelmiä, jotka on suunniteltu tarjoamaan lisäturvaa RSA-allekirjoituksille, esimerkiksi Probabilistic Signature Scheme for RSA (RSA-PSS).



 

Viestien allekirjoittaminen

Oletetaan, että Alice käyttää Bobin julkista avainta lähettääkseen hänelle salatun viestin. Viestissä hän voi väittää olevansa Alice, mutta Bobilla ei ole mitään keinoa todentaa, että viesti on todella Alicelta, koska kuka tahansa voi käyttää Bobin julkista avainta salattujen viestien lähettämiseen. Viestin alkuperän todentamiseksi RSA:ta voidaan siis käyttää myös viestin allekirjoittamiseen.

Oletetaan, että Alice haluaa lähettää allekirjoitetun viestin Bobille. Hän tuottaa viestistä hash-arvon, korottaa sen potenssiin d mod n (kuten viestiä purettaessa) ja liittää sen viestin "allekirjoitukseksi". Kun Bob vastaanottaa allekirjoitetun viestin, hän nostaa allekirjoituksen potenssiin e mod n (aivan kuten viestin salauksen yhteydessä) ja vertaa tuloksena saatua hash-arvoa viestin todelliseen hash-arvoon. Jos nämä kaksi vastaavat toisiaan, Bob tietää, että viestin kirjoittajalla oli Alicen salainen avain ja että viestiä ei ole sen jälkeen peukaloitu.

Huomaa, että RSA-PSS:n kaltaiset turvalliset pehmustejärjestelmät ovat yhtä tärkeitä viestin allekirjoittamisen turvallisuuden kannalta kuin viestin salaamisenkin kannalta ja että samaa avainta ei pitäisi koskaan käyttää sekä salaamiseen että allekirjoittamiseen.

 

Kysymyksiä ja vastauksia

Q: Mikä on RSA?


V: RSA (Rivest-Shamir-Adleman) on algoritmi, jota nykyaikaiset tietokoneet käyttävät viestien salaamiseen ja purkamiseen. Se on epäsymmetrinen salausalgoritmi.

K: Mitä epäsymmetrinen tarkoittaa?


V: Epäsymmetrinen tarkoittaa, että on olemassa kaksi eri avainta - julkinen avain ja yksityinen avain.

K: Mihin RSA-algoritmi perustuu?


V: Algoritmi perustuu siihen, että suuren yhdistetyn luvun tekijöiden löytäminen on vaikeaa - kun tekijät ovat alkulukuja, tätä ongelmaa kutsutaan alkutekijöinniksi.

K: Miten RSA toimii?


V: RSA:ssa käytetään julkista ja yksityistä avainta. Julkinen avain voi olla kaikkien tiedossa - sitä käytetään viestien salaamiseen. Julkisella avaimella salatut viestit voidaan purkaa vain yksityisellä avaimella, joka on pidettävä salassa. Yksityisen avaimen laskeminen julkisesta avaimesta on hyvin vaikeaa.

Kysymys: Onko tälle salaustyypille olemassa jokin muu nimi?


V: Tätä salaustyyppiä kutsutaan myös julkisen avaimen salaukseksi, koska toinen avaimista voidaan antaa kenelle tahansa, mutta toinen voidaan pitää salassa.

K: Luoko RSA avainparin?


V: Kyllä, RSA luo avainparin - julkisen ja yksityisen avaimen - joita käytetään salaukseen ja salauksen purkamiseen.


Etsiä
AlegsaOnline.com - 2020 / 2025 - License CC3