Criptarea AES și clientul Android

Criptarea AES și clientul Android

După cum se spune, nimic nu a prezis necazuri. Clientul mobil a fost tăiat încet, cafeaua a fost răcită, sarcinile au fost închise unul câte unul, până când brusc a sosit o scrisoare către poșta electronică:







să introducă urgent o nouă funcționalitate. Toți parametrii necesari pentru construirea unui model de afaceri, din motive de siguranță, vor fi transmise în criptat AES / CBC / PKCS5Padding cu vectorul de inițializare AAACCCDDDYYUURRS și cheie de criptare ZZHHYYTTUUHHGGRR. date criptate EXEMPLU:

p + oJjsGEULNSptP5Sj1BM5w65hMjkqzahORd8ybIkqyJD0V / 608c1tYuKIvDLUIa
RQ9jQ6 + EwbyMFjlMa6xuEnxOx4sez001hd3NsLO7p00XoTqAvi9zwUBII +
nPphP6Zr0P4icvODpmhlmRILgSBsUf1H / 3VN1lNXjo4LTa
GxLqW3VSg9iV9yFq4VMWqsRF

Încercările de a găsi soluții rapid au dat o grămadă de exemple non-funcționale au arătat că sarcina depășește aspectul obișnuit de aspect și scrie Presenter'ov și necesită studiul docilor și manualelor de lectură. O mare oportunitate de a învăța ceva nou și de a vă îmbogăți experiența.

Dar, mai întâi, să ne dăm seama ce este - criptarea și de ce este nevoie de el.

Un pic de teorie despre criptarea AES

Advanced Encryption Standard (AES) - un algoritm de criptare simetrică bloc adoptat de guvernul Statelor Unite pe baza rezultatelor concursului ca standard de criptare și a înlocuit un algoritm mai puțin fiabile Data Encryption Standard (DES). Algoritmul aprobat ca standard unic de criptare a devenit utilizat pe scară largă pentru protejarea datelor electronice.

Algoritmul se bazează cuprinde substituții, substituiri și transformări liniare, fiecare dintre acestea fiind executat în blocuri de 128 biți (cifre cu valori de 0 sau 1), constituie baza structurii datelor de intrare și de ieșire, și de aceea este denumirea cifrului blocului. Repetarea operațiilor are loc în mod repetat și în timpul fiecărei repetări (rotunde), se calculează o cheie unică pe baza cheii de criptare și se integrează în calcule ulterioare.

Cheia criptografică pentru algoritmul AES este o secvență de 128, 192 sau 256 de biți. Alți parametri ai datelor de intrare și ieșire și cheia criptografică nu sunt permise de standardul AES.

Fiabilitatea criptării este asigurată de faptul că schimbarea chiar a unui bloc implică schimbarea blocurilor ulterioare și schimbarea completă a datelor finale la ieșire.

Această abordare asigură fiabilitatea ridicată a algoritmului, care poate fi verificată luând în considerare următorul exemplu simplu:

Exemplu de calcul al timpului pentru hacking textul cipher

Tabelul 1: Dependența numărului de combinații de lungimea cheii

Cel mai rapid supercomputer: 10.51 Petaflops = 10.51 x 10 ^ 15 Flops (operațiuni în virgulă mobilă pe secundă)

Fie numărul optim de operații pe secundă necesar pentru a testa combinația optimistă: 1000

Numărul de combinații testate pe secundă = (10,51 x 10 ^ 15) / 1000 = 10,51 x 10 ^ 12

Numărul de secunde pentru un an = 365 x 24 x 60 x 60 = 31536000

Numărul de ani pentru a sparge AES 128-bit key = (3,4 x 10 ^ 38) / [(10,51 x 1012) x 31536000] = (0,323 x 10 ^ 26) / 31536000 = 1,02 x 10 ^ 18 = 1 miliard de miliarde de ani.

Descrierea detaliată a algoritmului în limba engleză: STANDARD DE ENCRYPȚIE AVANSATĂ
De asemenea, puteți citi acest articol minunat: Cum funcționează AES

Inițializare vectorială

Vectorul de inițializare (IV), un vector de inițializare, este un număr arbitrar care poate fi utilizat împreună cu o cheie secretă pentru criptarea datelor.

Utilizarea programului IV împiedică repetarea criptării datelor, ceea ce face ca procesul de hacking să fie mai dificil pentru hacker prin atac de dicționar, în încercarea de a găsi șabloane și de a rupe cifra. De exemplu, o secvență poate apărea de două ori sau mai mult în corpul mesajului. Dacă secvențele din datele criptate se repetă, atacatorul poate presupune că secvențele corespunzătoare din mesaj au fost, de asemenea, identice. IV previne apariția secvențelor de caractere repetate corespunzătoare în textul criptat.







Baza matematică

Pentru a ne aminti studiul bazei matematice, vom folosi materialul din documentația pentru algoritmul ADVANCED ENCRYPTION STANDARD. precum și acest material bun în limba rusă: Descrierea generală a algoritmului de criptare AES

Prin urmare, pentru o descriere a algoritmului utilizat de finit câmpului GF Galois (2 ^ 8), construit ca un GF câmp de extensie (2) = modulo un m polinom ireductibil (x) = x ^ 8 + x ^ 4 + x ^ 3 + x + 1. elementele GF câmp (2 ^ 8) sunt polinoame de forma

b_7 · x ^ 7 + b_6 · x ^ 6 + b_5 · x ^ 5 + b_4 · x ^ 4 + b_3 · x ^ 3 + B_2 · x ^ 2 + b_1 · x + b_0

Operațiile în teren sunt efectuate modulo m (x). În total, există 2 8 8 = 256 polinoame în câmpul GF (2 ^ 8).

Operațiile matematice de bază din câmpul GF (2 ^ 8)

  1. Adăugarea octeților poate fi efectuată în oricare din cele trei moduri:
    • reprezintă octeți de polinoame de biți și le adaugă prin regula obișnuită de sumare a polinomilor cu reducerea ulterioară a coeficienților sumo modulo 2 (operația XOR asupra coeficienților);
    • suma prin modulul 2 biții corespunzători în octeți;
    • adăugați octeții în notație hexazecimală.
  2. Bytes-urile se înmulțesc prin utilizarea reprezentării lor
    polinoame și multiplicare prin regulile obișnuite algebrice.
    Produsul rezultat trebuie modulat prin polinomul m (x) = x ^ 8 + x ^ 4 + x ^ 3 + x + 1 (rezultatul reducerii este egal cu restul de împărțirea produsului cu m (x))
  3. Pentru orice polinom bit alunecos b (x) din câmpul GF (2 ^ 8)
    Există un polinom b ^ -1 (x) invers în el
    multiplicare, adică b (x) · b ^ -1 (x) = 1 mod m (x)

Polinoamele cu coeficienți aparținând câmpului GF (2 ^ 8)
Polinoamele de gradul al treilea cu coeficienți în domeniul finit
Câmpurile a_i ∈ GF (2 ^ 8) au forma: a (x) = a_3 · x ^ 3 + a_2 · x ^ 2 + a_1 · x + a_0

Astfel, în aceste polinoame în rolul coeficienților pentru necunoscuți, octeții sunt utilizați în locul biților. Mai mult, aceste polinoame vor fi reprezentate sub forma cuvântului [a_0, a_1, a_2, a_3]. În standardul AES, multiplicarea polinomilor formei (1) folosește reducerea modulo a unui alt polinom x ^ 4 + 1.

Pentru a studia aritmetice considerate polinoamele introduce suplimentar polinom b (x) = b_3 · x ^ 3 + B_2 · x ^ 2 + b_1 · x + b_0, unde b_i ∈ GF (2 ^ 8). atunci

d (x) = a (x) · b (x) = d_3 · x ^ 3 + d_2 · x ^ 2 + d_1 · x + d_0

Setările de criptare

Ei bine, există AES și vectorul de inițializare a devenit clar. Încercați acum să înțelegeți restul cuvintelor din linia AES / CBC / PKCS5Padding

Blocarea blocurilor de cifre (CBC) - modul de cuplare a blocurilor de text cifrat - unul dintre modurile de criptare pentru un cifru de bloc simetric folosind mecanismul de feedback. Fiecărui bloc de text simplu (cu excepția primului) se adaugă bito-bit modulo 2 cu rezultatul anterior. O singură eroare în bitul blocului de cifru afectează decodificarea tuturor blocurilor ulterioare. Reconstruirea ordinii de blocuri de text cifrat cauzează deteriorarea rezultatului de decriptare.

Criptarea AES și clientul Android

Un alt parametru este PKCS5Padding. indică modul în care trebuie tratate blocurile parțiale. Când utilizați unul dintre algoritmii de umplere obișnuiți, trebuie să includeți dimensiunea blocului în datele criptate, asigurându-vă că atunci când încercați să decriptați mesajul criptat, veți obține numărul necesar de octeți.

Pentru performanța tuturor parametrilor de criptare AES, fiecare implementare a platformei Java trebuie să suporte următoarele algoritmi standard de criptare cu dimensiunile cheilor (în paranteze):

Transformări standard de cifru

  • AES / CBC / NoPadding (128)
  • AES / CBC / PKCS5Padding (128)
  • AES / BCE / NoPadding (128)
  • AES / ECB / PKCS5Padding (128)
  • DES / CBC / NoPadding (56)
  • DES / CBC / PKCS5Padding (56)
  • DES / BCE / NoPadding (56)
  • DES / ECB / PKCS5Padding (56)
  • Desene / CBC / NoPadding (168)
  • Desene / CBC / PKCS5Padding (168)
  • Deșeuri / BCE / NoPadding (168)
  • DESEDE / ECB / PKCS5Padding (168)
  • RSA / ECB / PKCS1Padding (1024, 2048)
  • RSA / ECB / OAEPWithSHA-1AndMGF1Padding (1024, 2048)
  • RSA / ECB / OAEPWithSHA-256AndMGF1Padding (1024, 2048)

Sicriul tocmai sa deschis

Criptarea AES și clientul Android

După înțelegerea teoriei, puteți începe să implementați algoritmul însuși pentru a decripta mesajul serverului.

În contrast cu setul standard JDK, pentru lucru avem nevoie de android.util.Base64 pentru a converti șirul:

De asemenea, trebuie avut în vedere că dimensiunea vectorului de inițializare trebuie să fie de 16 octeți (128 biți). Acest lucru se datorează faptului că standardul de criptare AES include trei tipuri de cifruri bloc: AES - 128, AES - 192 și AES - 256. Fiecare dintre aceste coduri este de 128 - dimensiunea biți bloc, cu o dimensiune cheie de 128, 192 și 256 biți, respectiv și luând în considerare faptul că pentru toate tipurile de cifru bloc, un vector de inițializare de aceeași dimensiune ca dimensiunea blocului de cifru, ajungem că vectorul de inițializare are întotdeauna o dimensiune de 128 biți.

În caz contrar, chiar dacă încercăm să folosim un vector de o mărime diferită, textul cifrat nu va fi descifrat și vom obține următoarea excepție:

După cum se poate observa din implementare, soluția sa dovedit a fi destul de simplă și trivială în contextul problemelor de acest tip. Cu toate acestea, uneori este foarte util să sapi în docuri și să realizați ceea ce nu se întâmplă atât de des în zilele lucrătoare ale dezvoltatorului Android.

Pentru cel mai curios - sub spoiler, ce a fost criptat în mesaj:

răspunde la problemă







Articole similare

Trimiteți-le prietenilor: