AES - Qabaqcıl Şifrləmə Standartı

AES simmetrik şifrləmə alqoritmidir, yəni həm şifrləmə, həm də deşifrləmə üçün eyni açardan istifadə edir.

O, TLS kimi bir çox protokolda istifadə olunur. Bu məqaləni oxuyarkən, AES, çox güman ki, bu veb-sayt ilə cihazınız arasında olan məlumatları şifrələyir.

AES 16 baytdan ibarət 4×4 matris üzərində işləyən SP-şəbəkəsidir, bu matris “vəziyyət” (state) adlanır.

Alqoritm bir neçə raunddan ibarətdir. Bir raund dörd vəziyyət transformasiyasından ibarətdir, hər bir addım yaxşı şifrləmə alqoritminin adətən malik olduğu qarışıqlıqyayılma xüsusiyyətlərini təmin etmək üçün nəzərdə tutulub.

AES Açar ÖlçüsüRaundlar
128-bit10
192-bit12
256-bit14

Gəlin şifrləmə və deşifrləmənin icmalına baxaq, sonra hər bir proseduru daha ətraflı müzakirə edəcəyəm.

Şifrləmə

AES şifrləmə prosesi açar genişləndirilməsi ilə başlayır; əsas şifrləmə açarından bir neçə raund açarı əldə edilir. Bundan sonra biz sadəcə bir neçə əməliyyatdan ibarət raundları həyata keçiririk: SubBytes, ShiftRows, MixColumns və AddRoundKey.

Bu diaqrama baxın:

Qabaqcıl Şifrləmə Standartı (AES) Şifrləmə

Deşifrləmə

Deşifrləmə üçün, demək olar ki, proses eynidir, lakin tərs qaydada; əməliyyatların tərs versiyalarından istifadə edirik: InvSubBytes, InvShiftRows, InvMixColumns və AddRoundKey.

Qeyd edək ki, deşifrləmədə AddRoundKey InvMixColumns-dan əvvəl gəlir ki, riyazi xüsusiyyətlər saxlanılsın.

Qabaqcıl Şifrləmə Standartı (AES) Deşifrləmə

İndi hər bir proseduru daha ətraflı nəzərdən keçirək.

Açar Genişlənməsi

Hər şeydən əvvəl raund açarlarına ehtiyacımız var. Onlar “AES Key Schedule” adlanan xüsusi alqoritmdən istifadə edərək əsas şifrləmə açarından hesablanacaq.

Biz N+1 açar yaradacayıq, burada N əsas raundların sayıdır. Məsələn, AES-256-da 14 əsas raund var; biz 15 açar yaradacağıq, çünki ilkin raund üçün əlavə bir açara ehtiyac var.

Əsas açarımızı sözlərə bölürük. Bu kontekstdə bir söz 4 baytdır. Beləliklə, bir raund açarı 4 sözdür və ölçüsü 16 baytdır.

İlkin sözlər sadəcə əsas şifrləmə açarının sözləridir.

Yeni sözlər əvvəlki sözlərlə XOR əməliyyatlarının kombinasiyası ilə hesablanır, mövqeyə görə onlara xüsusi transformasiyalar edilə bilər.

Hər N-ci sözü (burada N əsas açarın söz uzunluğudur) generasiya edərkən baytları bir mövqe sola fırladırıq (RotWord), sonra onları sbox ilə əvəz edirik (SubWord) və nəticə xüsusi raund sabiti ilə XOR edirik.

Raund sabitləri
RaundRaund sabiti (RCON)
10x01
20x02
30x04
40x08
50x10
60x20
70x40
80x80
90x1B
100x36
110x6C
120xD8
130xAB
140x4D
150x9A

AES-256 üçün hər genişləndirmə dövrünün yarısında əlavə SubWord əməliyyatını icra etməliyik.

Bu proses bütün raund açarlarını hesablayana qədər davam edir.

Aşağıda hər açar ölçüsü üçün açar generasiya alqoritminin necə işlədiyinə dair vizual izahatlar verilmişdir. Bəzən şəkillərlə izah etmək sözlərdən daha asandır.

AES-128 Açar Genişlənməsi

AES-128 Açar Genişlənməsi

AES-192 Açar Genişlənməsi

AES-192 Açar Genişlənməsi

AES-256 Açar Genişlənməsi

AES-256 Açar Genişlənməsi

Açar genişləndirildikdən sonra SubBytes ilə başlayaraq əsas çevrilmələrə keçirik.


SubBytes

Bu, qeyri-xətti əvəzetmə addımıdır, burada hər bayt S-box adlanan əvvəlcədən müəyyən edilmiş cədvəldən istifadə edərək başqa bir baytla əvəz olunur.

S-box cədvəlində 256 unikal dəyər var. Bunlar bir baytın ala biləcəyi bütün mümkün dəyərlərdir.

AES - SubBytes

S-box cədvəli
Mətn baytıƏvəzedici bayt
0000000001100011
0000000101111100
0000001001110111
0000001101111011
0000010011110010
0000010101101011
0000011001101111
0000011111000101
0000100000110000
0000100100000001
0000101001100111
0000101100101011
0000110011111110
0000110111010111
0000111010101011
0000111101110110
0001000011001010
0001000110000010
0001001011001001
0001001101111101
0001010011111010
0001010101011001
0001011001000111
0001011111110000
0001100010101101
0001100111010100
0001101010100010
0001101110101111
0001110010011100
0001110110100100
0001111001110010
0001111111000000
0010000010110111
0010000111111101
0010001010010011
0010001100100110
0010010000110110
0010010100111111
0010011011110111
0010011111001100
0010100000110100
0010100110100101
0010101011100101
0010101111110001
0010110001110001
0010110111011000
0010111000110001
0010111100010101
0011000000000100
0011000111000111
0011001000100011
0011001111000011
0011010000011000
0011010110010110
0011011000000101
0011011110011010
0011100000000111
0011100100010010
0011101010000000
0011101111100010
0011110011101011
0011110100100111
0011111010110010
0011111101110101
0100000000001001
0100000110000011
0100001000101100
0100001100011010
0100010000011011
0100010101101110
0100011001011010
0100011110100000
0100100001010010
0100100100111011
0100101011010110
0100101110110011
0100110000101001
0100110111100011
0100111000101111
0100111110000100
0101000001010011
0101000111010001
0101001000000000
0101001111101101
0101010000100000
0101010111111100
0101011010110001
0101011101011011
0101100001101010
0101100111001011
0101101010111110
0101101100111001
0101110001001010
0101110101001100
0101111001011000
0101111111001111
0110000011010000
0110000111101111
0110001010101010
0110001111111011
0110010001000011
0110010101001101
0110011000110011
0110011110000101
0110100001000101
0110100111111001
0110101000000010
0110101101111111
0110110001010000
0110110100111100
0110111010011111
0110111110101000
0111000001010001
0111000110100011
0111001001000000
0111001110001111
0111010010010010
0111010110011101
0111011000111000
0111011111110101
0111100010111100
0111100110110110
0111101011011010
0111101100100001
0111110000010000
0111110111111111
0111111011110011
0111111111010010
1000000011001101
1000000100001100
1000001000010011
1000001111101100
1000010001011111
1000010110010111
1000011001000100
1000011100010111
1000100011000100
1000100110100111
1000101001111110
1000101100111101
1000110001100100
1000110101011101
1000111000011001
1000111101110011
1001000001100000
1001000110000001
1001001001001111
1001001111011100
1001010000100010
1001010100101010
1001011010010000
1001011110001000
1001100001000110
1001100111101110
1001101010111000
1001101100010100
1001110011011110
1001110101011110
1001111000001011
1001111111011011
1010000011100000
1010000100110010
1010001000111010
1010001100001010
1010010001001001
1010010100000110
1010011000100100
1010011101011100
1010100011000010
1010100111010011
1010101010101100
1010101101100010
1010110010010001
1010110110010101
1010111011100100
1010111101111001
1011000011100111
1011000111001000
1011001000110111
1011001101101101
1011010010001101
1011010111010101
1011011001001110
1011011110101001
1011100001101100
1011100101010110
1011101011110100
1011101111101010
1011110001100101
1011110101111010
1011111010101110
1011111100001000
1100000010111010
1100000101111000
1100001000100101
1100001100101110
1100010000011100
1100010110100110
1100011010110100
1100011111000110
1100100011101000
1100100111011101
1100101001110100
1100101100011111
1100110001001011
1100110110111101
1100111010001011
1100111110001010
1101000001110000
1101000100111110
1101001010110101
1101001101100110
1101010001001000
1101010100000011
1101011011110110
1101011100001110
1101100001100001
1101100100110101
1101101001010111
1101101110111001
1101110010000110
1101110111000001
1101111000011101
1101111110011110
1110000011100001
1110000111111000
1110001010011000
1110001100010001
1110010001101001
1110010111011001
1110011010001110
1110011110010100
1110100010011011
1110100100011110
1110101010000111
1110101111101001
1110110011001110
1110110101010101
1110111000101000
1110111111011111
1111000010001100
1111000110100001
1111001010001001
1111001100001101
1111010010111111
1111010111100110
1111011001000010
1111011101101000
1111100001000001
1111100110011001
1111101000101101
1111101100001111
1111110010110000
1111110101010100
1111111010111011
1111111100010110

ShiftRows

ShiftRows addımında hər sətir dairəvi şəkildə sola çəkilir:

  • Sətir 1: yerində qalır
  • Sətir 2: 1 bayt sola çəkilir
  • Sətir 3: 2 bayt sola çəkilir
  • Sətir 4: 3 bayt sola çəkilir

AES - ShiftRows


MixColumns

MixColumns addımında hər sütun Galois Sahəsi GF(2⁸) üzərində sabit 4x4 matrisinə vurulur.

Bu vurma standart skalyar hasil deyil, lakin oxşar bir əməliyyatdır.

Hər baytı aşağıdakı polinom kimi təsvir edirik:

b7·x^7 + b6·x^6 + b5·x^5 + b4·x^4 + b3·x^3 + b2·x^2 + b1·x + b0

Matris vurması zamanı “toplama” XOR ilə həyata keçirilir, “vurma” isə polinom vurmasını və x⁸+x⁴+x³+x+1 polinomu ilə modul azaldılmasını əhatə edir.

Bu əməliyyat yayılmanı həyata keçirir, burada hər bayt eyni sütundakı bütün digər baytlardan asılı bir dəyər alır, bu da şifrəmətni statistik təhlilini çətinləşdirir.

Qeyd: Son raundda deşifrləməni asanlaşdırmaq və əlavə hesablamalardan uzaq olmaq üçün MixColumns addımını icra etmirik.

AES - MixColumns


AddRoundKey

Bu addımda vəziyyətin hər baytı raund açarının müvafiq baytı ilə XOR əməliyyatı istifadə edərək matris kombinə olunur.

Yeri gəlmişkən, deşifrləmə üçün ayrıca InvAddRoundKey addımına ehtiyac yoxdur, çünki ikinci XOR tətbiqi birincisini onsuzda ləğv edir.

AES - AddRoundKey


Əməliyyat Rejimləri

Bir bloku rejimsiz şifrləmək mümükündür, lakin bir neçə blok olanda biz adətən ECB, CBC, CTR və GCM kimi əməliyyat rejimlərindən istifadə edirik. Bu rejimlər şifrləmənin bir neçə blok üzərində tətbiqini müəyyənləşdirir.

RejimTəsvir
ECBHər blok müstəqil şəkildə şifrələnir.
CBCHər blok əvvəlki şifrəli mətnlə qarışdırılır.
CTRSayğac dəyəri şifrələnir və blokla qarışdırılır.
GCMCTR rejimi kimi + əlavə bütövlüyü yoxlaması imkanı.

CBC rejiminin vizual nümunəsi:

AES - CBC rejimi

Paddinq Sxemləri

Mətn çox vaxt AES-in 16 bayt olan blok ölçüsünə tam bölünmür; boş yer qalır.

Qalan yeri doldurmaq üçün paddinq sxemləri (doldurma sxemləri) istifadə olunur. Tanınmış paddinq sxemləri PKCS#7, ANSI X.923 və Zero Padding.

PKCS#7 bloku tamamlamaq üçün N bayt dəyərini N dəfə boş yerlərə əlavə edir. Məlumat 16 bayta tam uyğun gəlsə belə, əlavə tam paddinq bloku əlavə edir.

ANSI X.923 son paddinq baytını paddinq uzunluğuna təyin edir və qalanını sıfırlarla doldurur. PKCS#7 kimi, paddinq tələb olunmadıqda belə əlavə paddinq bloku əlavə edir.

Zero Padding boş yeri sadəcə sıfırlarla doldurur, baxmayaraq ki, bu, açıq mətn təbii olaraq sıfırlarla bitərsə problemlər yarada bilər.

AES - Doldurma/Paddinq Sxemləri

Açar Mübadiləsi Problemi

Simmetrik şifrləmə sistemlərinin ümumi problemi olan açar mübadiləsi məsələsidir. Hər iki tərəf eyni gizli açara malik olmalıdır. Ən təhlükəsiz yol açarı ikinci tərəflə şəxsi görüşdə təqdim etmək ola bilər, lakin bu uzaq məsafələr üçün praktiki deyil. Diffie-Hellman açar mübadiləsi riyaziyyatdan istifadə edərək iki tərəfin açıq kanal üzərindən ümumi gizli açar yaratmasına imkan verir (bu barədə ayrıca məqalə yazmışam).

Performans

AES standart olaraq seçilməsinin səbəbi təkcə yaxşı şifrləmə performansı deyil, həm də bunu çox sürətli etməsidir.

Intel və AMD hətta AES şifrləməsi üçün birbaşa CPU təlimatları tətbiq etmişdir.

Həmçinin, MixColumns addımında polinom vurmasını hər dəfə həyata keçirmək əvəzinə, bütün mümkün bayt dəyərləri üçün nəticələr əvvəlcədən hesablana və cədvəldən tapıla bilər. Cədvəlin giriş vaxtı adətən O(1)-dir, yəni sabit bir vaxtdır.

Qabaqcıl Şifrləmə Standartı haqqında bu məqaləni oxuduğunuz üçün təşəkkür edirəm. Sizə xoş gün arzulayıram.

C dilində yazdığım AES-256-CBC alqoritminin implementasiyasını bu repozitoriyadan oxuya bilərsiniz.