Criptografie (3) - Introducere in AES Advanced Encryption Standard

Introducere in AES  - Advanced Encryption Standard

AES (Standardul Avansat de Criptare) este un algoritm de criptare utilizat pe scară largă care a fost adoptat de guvernul SUA în 2001. Este un algoritm cu cheie simetrică, ceea ce înseamnă că aceeași cheie este utilizată atât pentru criptarea cât și pentru decriptarea datelor. AES folosește un bloc de dimensiune fixă de 128 de biți și poate utiliza dimensiuni de cheie de 128, 192 sau 256 de biți. Procesul de criptare implică mai multe runde de operații, incluzând operații de substituție, permutare și XOR, pentru a amesteca datele din bloc. Procesul de decriptare inverses aceste operații pentru a revela datele originale. AES este considerat a fi o metodă de criptare foarte sigură și este utilizat într-o gamă largă de aplicații, inclusiv comunicarea online și stocarea datelor.

Standardul de criptare avansată (AES), cunoscut și sub numele său original Rijndael, este o specificație pentru criptarea datelor electronice stabilită de Institutul Național de Standarde și Tehnologie (NIST) din S.U.A. 2001. AES este o variantă a cifrului bloc Rijndael dezvoltat de doi criptografi belgieni, Joan Daemen și Vincent Rijmen, care au înaintat o propunere la NIST în timpul procesului de selecție AES.

Rijndael este o familie de cifruri cu diferite dimensiuni de cheie și bloc. Pentru AES, NIST a selectat trei membri ai familiei Rijndael, fiecare cu o dimensiune de bloc de 128 de biți, dar trei lungimi de cheie diferite: 128, 192 și 256 de biți. 

AES a fost adoptat de guvernul SUA. Acesta înlocuiește Standardul de criptare a datelor (DES), care a fost publicat în 1977. Algoritmul descris de AES este un algoritm cu cheie simetrică, ceea ce înseamnă că aceeași cheie este utilizată atât pentru criptarea, cât și pentru decriptarea datelor.

AES a intrat în vigoare ca standard al guvernului federal al SUA pe 26 mai 2002, după aprobarea de către Secretarul de Comerț al SUA. AES este disponibil în multe pachete de criptare diferite și este primul (și singurul) cifru accesibil public aprobat de Agenția de Securitate Națională a S.U.A. (NSA) pentru informații super secrete atunci când este utilizat într-un modul criptografic aprobat de NSA.

Aspecte de implementare

• Rijndael poate fi implementat pentru a rula la viteze neobișnuit de rapide pentru un cifru de bloc pe un calculator la 200Mhz. Există un compromis între table size/performanță. 

• Rijndael poate fi implementat pe un microcontroller  (gen arduino) într-o cantitate mică de cod deci se pretează la implementarea embedded, folosind o cantitate mică de RAM și luând un număr mic de cicluri.

• Deoarece cifrul nu folosește operații aritmetice, nu are nici o dependință față de arhitecturile de procesoare Little Endian sau Big Endian

Extensii

• Designul permite specificarea variantelor cu lungimea blocului și lungimea cheii ambele variind de la 128 la 256 de biți în pași de 32 de biți. 

• Deși numărul de runde de Rijndael este fixat în specificație, poate fi modificat ca parametru în cazul unor probleme de securitate
 

Limitările cifrului 

Acest cifru are câteva limitări care au de-a face cu inversul său:  

• Cifrul invers este mai puțin potrivit pentru a fi implementat pe un microcontroller (gen arduino), decât cifrul în sine: este nevoie de mai mult cod și cicluri. (Totuși, în comparație cu alte cifruri, chiar și inversul este foarte rapid) 

 • În software, cifrul și inversul său folosesc diferite coduri și/sau tabele. 

 • În hardware, cifrul invers poate reutiliza doar parțial circuitele care le implementează cifrul.

Schema flowchart


Procesul de criptare AES constă din 10 sau 14 runde (în funcție de dimensiunea cheii), fiecare dintre acestea conținând următoarele operații:

  1. Adăugarea cheii (AddRoundKey): XOR-ul cheii cu blocul de date.

  2. Substituția bytes-ilor (SubBytes): înlocuirea fiecărui byte din bloc cu un alt byte din o tabelă predefinită, numită S-box. Aceasta este o operație non-lineare care face datele mai dificil de analizat.

  3. Shiftarea coloanelor (ShiftRows): deplasarea bytes-ilor în fiecare rând din bloc într-o anumită direcție. Aceasta adaugă dependență între bytes-ii din diferite poziții din bloc.

  4. Mixarea coloanelor (MixColumns): combinarea bytes-ilor din fiecare coloană a blocului printr-o operație matematică specifică. Aceasta adaugă dependență între coloanele din bloc.

Runda finală a criptării AES conține doar operațiile 1 și 2.

Procesul de decriptare AES inversează aceste operații, prin:

  1. Inversarea Adăugarea cheii (Inverse AddRoundKey)

  2. Inversarea Substituția bytes-ilor (Inverse SubBytes)

  3. Inversarea Shiftarea coloanelor (Inverse ShiftRows)

  4. Inversarea Mixarea coloanelor (Inverse MixColumns)

Acest proces se repetă în mod corespunzător, cu excepția ultimei runde, unde se folosește doar Inversarea Adăugarea cheii și Inversarea Substituția bytes-ilor. Acest proces de decriptare va duce la recuperarea datelor originale.

AES este un algoritm de criptare foarte sigur, cu un număr mare de runde și operații complexe, care fac dificilă găsirea cheii sau a datelor originale.

Recomand implementarea OpenSSL, care am testat-o și eu mai jos într-un exemplu foarte simplu.

 Cod de test:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "openssl/crypto.h"
#include "openssl/aes.h"

#define BLOCK_SIZE 16

static const unsigned char key[] = {
    0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
    0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

int main()
{
    unsigned char text[] = "hello world!";
    unsigned char enc_out[80];
    unsigned char dec_out[80];

    AES_KEY enc_key, dec_key;

    AES_set_encrypt_key(key, 128, &enc_key);
    AES_encrypt(text, enc_out, &enc_key);

    AES_set_decrypt_key(key, 128, &dec_key);
    AES_decrypt(enc_out, dec_out, &dec_key);

    int i;

    printf("original:\t");
    for (i = 0; *(text + i) != 0x00; i++)
        printf("%X ", *(text + i));
    printf("\nencrypted:\t");
    for (i = 0; *(enc_out + i) != 0x00; i++)
        printf("%X ", *(enc_out + i));
    printf("\ndecrypted:\t");
    for (i = 0; *(dec_out + i) != 0x00; i++)
        printf("%X ", *(dec_out + i));
    printf("\n");

    return 0;
}

Configurări și Rezultat

  •  Înainte de configura și de a compila a trebuit să instalez Win32 OpenSSL care mai departe îmi instalează fișierele header și fișierele lib, necesare pentru compilare și link-editare.
  •  În fișierul Tasks.json a trebuit să adaug -lssl,-lcrypto și calea către fișierele lib -L C:\\Program Files\\OpenSSL-Win64\\lib:
{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe build active file",
            "command": "C:\\msys64\\mingw64\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "-lssl",
                "-lcrypto",
                "-L C:\\Program Files\\OpenSSL-Win64\\lib"
            ],
            "options": {
                "cwd": "C:\\msys64\\mingw64\\bin"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}
  • Iar în fișierul c_cpp_proprieties.json a trebuit să adaug calea către include-uri "C:\\Program Files\\OpenSSL-Win64\\include"
{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:\\Program Files\\OpenSSL-Win64\\include"
                
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.19041.0",
            "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.28.29910/bin/Hostx64/x64/cl.exe",
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-msvc-x64",
            "compilerArgs": [
               "-lssl", 
               "-lcrypto",
               "-L C:\\Program Files\\OpenSSL-Win64\\lib"
            ]
        }
    ],
    "version": 4
}
În Visual studio code:
Ctrl + Shift + B =» build source code
F5 =» Build + Debug

AES  - Advanced Encryption Standard

 Documentație

Afiliere eMag

 Linkurile de la secțiunea "Componente" conțin adresa mea de afiliere la eMag.ro, iar dacă cumperi folosind aceste linkuri vei susține blogul meu. Mulțumesc! 

eMag Genius:
Hai și tu în Genius! Abonează-te la Genius 12 luni și primești beneficii premium și 20 lei card cadou eMAG. Profită acum! eMag Genius

Mulțumesc pentru atenție!

Pentru întrebari și/sau consultanță tehnică vă stau la dispozitie pe blog mai jos în secțiunea de comentarii sau pe email simedruflorin@automatic-house.ro. O zi și seară plăcută tuturor ! 

 

 Back to top of page

Etichete

Afișați mai multe

Arhiva

Afișați mai multe