Kriptogrāfija

thumb|235px|Vāciešu Lorenca šifrēšanas mašīna, kura tika izmantota Otrā pasaules kara laikā.

**Kriptogrāfija** ( — slepens, apslēpts; *γράφω, gráphō* — rakstīt), arī **kriptoloģija**, ir informācijas kodēšanas teorijas nozare, kurā izstrādā ziņojumu šifrēšanas un dešifrēšanas metodes, lai aizsargātu tos pret nevēlamu nolasīšanu. Mūsdienās šajā nozarē ir nepieciešamas gan matemātikas, gan datorzinātnes zināšanas, kuras ir cieši saistītas ar skaitļu teoriju, informācijas teoriju, datoru drošību un inženieriju. Kriptogrāfijas sniegtās iespējas plaši tiek izmantotas sadzīvē, piemēram, bankas automātos, datoru parolēs, elektroniskajā tirdzniecībā un citur.

## Mūsdienās lietotie kriptogrāfiskie algoritmi
Kriptogrāfiskos algoritmus var iedalīt simetriskajos un asimetriskajos. Simetriskie ir simetriskie šifrēšanas algoritmi un *hash* funkcijas. Dažreiz *hash* funkcijas izdala atsevišķi. Asimetriskie ir asimetriskie šifrēšanas, paraksta un atslēgu apmaiņas algoritmi. Dažus var lietot vairāk kā vienam mērķim (piemēram, RSA var lietot gan šifrēšanai, gan parakstam).

### Simetriskie algoritmi
Simetriskos šifrēšanas algoritmus iedala bloku šifros (*block cipher*) un plūsmas šifros (*stream cipher*). Bloku šifri nošifrē (un atšifrē) noteikta izmēra datu bloku (parasti 8—16 baiti), izmantojot dotu atslēgu. Atslēga (*key*) ir brīvi izraudzīts, noteikta garuma datu bloks vai liels skaitlis. Simetrisko šifru atslēgas ir jātur slepenībā, jo jebkurš, kas tiek klāt pie atslēgas, var atšifrēt visu, kas ar atslēgu ir nošifrēts. Lai nošifrētu lielāku daudzumu datu, blokus apvieno kopā. Eksistē vairākas metodes, tām ir dažādas priekšrocības un trūkumi. No tām nozīmīgākās ir ECB (vienkārša), CBC (droša), OFB, CFB, CTR (šie 3 bloku šifru pārveido par plūsmas šifru). Plūsmas šifri ģenerē pseido gadījumskaitļu virkni (*pseudorandom bit sequence*), kas ir atkarīga no šifra atslēgas. To virkni kombinējot ar šifrējamajiem vai atšifrējamajiem datiem (izmantojot XOR operāciju), notiek šifrēšana vai atšifrēšana. Simetriskos šifrus lieto datu šifrēšanai. Šifrēšanai un atšifrēšanai lieto vai nu vienu un to pašu atslēgu (parasti), vai arī lieto saistītas atslēgas, t.i., no vienas atslēgas var viegli aprēķināt otru. Plašāk pazīstamie bloku šifri ir DES un AES, plašāk pazīstamais plūsmas (*stream*) šifrs ir RC4.

Jaucējfunkcijas (*Hash* funkcijas) no liela, mainīga izmēra datu bloka izveido mazu, konstanta garuma datu bloku. Pēc uzbūves tās ir līdzīgas bloku šifriem. Visām *hash* funkcijām pie vieniem izejas datiem ir iespējami vairāk kā vieni ieejas dati (jo ieejas dati ir garāki). Kriptogrāfiskajām hash funkcijām ir svarīgi, lai pie vieniem ieejas datiem būtu grūti piemeklēt otrus ieejas datus, kas dod to pašu *hash* (izejas datus). *Hash* funkcijas lieto datu autentificēšanai (ciparparakstiem) un simetrisko šifru atslēgu ģenerēšanai no parolēm. Plaši pazīstamas *hash* funkcijas ir MD5, SHA1, SHA256, SHA512 (šitās lieto(ja) TLS un bittorrent) un TIGER (lieto DC++).

### Asimetriskie algoritmi
Visi asimetriskie algoritmi lieto 2 atslēgas: privāto atslēgu un publisko atslēgu. Privāto atslēgu tur slepenībā, publisko atslēgu var izplatīt visiem, kam nepieciešams. No publiskās atslēgas ir grūti aprēķināt privāto atslēgu (vismaz ir jābūt grūti). Visi asimetriskie algoritmi ir lēnāki kā simetriskie algoritmi, tāpēc ar tiem apstrādā tikai nelielus datu blokus (simetriskās atslēgas, objektu *hash*). Simetrisko algoritmu atslēgas parasti ir nejauši izvēlēti gadījumskaitļi, tām vienīgais obligāti nepieciešamais kritērijs ir noteikts garums (kas atkarīgs no algoritma). Asimetriskās atslēgas arī ģenerē no gadījumskaitļiem, bet tur ir divas saistītas atslēgas un pēc gadījumskaitļa (privātās atslēgas) izvēles, no tā vēl ir jāaprēķina publiskā atslēga.
Kopā ir 3 veidu algoritmi:
* Šifrēšanas algoritmi;
* Atslēgu apmaiņas algoritmi (*key exchange*);
* Paraksta algoritmi (*digital signature*).
Dažus algoritmus var lietot vairāk kā vienai funkcijai (RSA var šifrēt un parakstīt), dažus var lietot tikai vienai funkcijai (DH var lietot tikai atslēgu apmaiņai, DSA var tikai parakstīt).

Šifrēšanas algoritmi šifrē datus izmantojot publisko atslēgu. Šifrējamie dati gandrīz vienmēr ir kāda simetriskā šifrēšanas algoritma atslēga (vai viens no datu komponentiem, no kuriem aprēķina simetrisko atslēgu). Datus, kas nošifrēti ar publisko atslēgu, var atšifrēt tikai ir atbilstošo privāto atslēgu. Pazīstamākais asimetriskais šifrēšanas algoritms ir RSA.

Atslēgu apmaiņas algoritmi ģenerē simetriskās atslēgas, apmainoties ar publiskajām atslēgām un savienojot tās ar sava gala privātajām atslēgām. Atslēgu apmaiņu var veikt arī vienā galā uzģenerējot simetrisko atslēgu, nošifrējot to ar asimetrisko šifrēšanas algoritmu un aizsūtot uz otru galu. Atslēgu apmaiņas algoritmus ar nelielām modifikācijām var lietot arī šifrēšanai (tikai te nevarēs izvēlēties simetrisko atslēgu, tā būs nejauša). Pazīstamākie atslēgu apmaiņas algoritmi ir DH un tā modifikācija ECDH.

Paraksta algoritmi izveido elektronisko parakstu, izmantojot privāto atslēgu. To parakstu pēc tam var pārbaudīt izmantojot publisko atslēgu. Te nenotiek šifrēšana. Vispārīgajā gadījumā paraksts ir parakstāmie dati, kas "nošifrēti" ar privāto atslēgu. Paraksta pārbaudei nepieciešama publiskā atslēga un paraksta pārbaude ir paraksta "atšifrēšana" ar publisko atslēgu. Ja tā notiek veiksmīgi, paraksts ir derīgs, ja nē, tad nav. Reāli, paraksta algoritmi spēj apstrādāt tikai nelielus datu blokus, tāpēc no parakstāmajiem datiem aprēķina *hash* un paraksta to (un pieliek klāt parakstītajiem datiem). Paraksta pārbaude tad sastāv no tā *hash* atšifrēšanas, esošo datu *hash* aprēķināšanas un to abu *hash* salīdzināšanas (tiem jābūt vienādiem). Pazīstamākie paraksta algoritmi ir RSA, DSA un DSA modifikācija ECDSA.