Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)


 

 

 

 



AES-ті қалай қолдану керек?



Бұл алгоритм, өрнектеу үшін құпия кілтті қолданып, бір 128-биттік блокты басқасына өрнектейді. алынған 128-биттік блокты кері шифрлеу үшін сол құпия кілтпен екінші өрнектеуді қолданады. Бұл мынандай көрініс береді:

cipher = encrypt(block, key) // key арқылы block-ты шифрлейміз

block = decrypt(cipher, key) // key арқылы cipher-ді кері шифрлейміз

 

Блоктың мөлшері әрқашанда 128-битке тең. Кілттің де бекітілген мөлшері болады. Кез келген мәтінді кез келген парольмен шифрлау үшін былай істеуге болады:

· Парольдан хеш алу

· AES стандартында жазылған ережелер бойынша хеш-ті кілтке айналдыру

· Мәтінді 128-биттен тұратын блоктарға бөліп тастау

· Әр блокты cipher функциясымен шифрлау

 

Бұны былай жазуға болады:

 

hash = md5(password) // MD5 хештің ұзындығы 128 бит

key = keyexpansion(hash) // хешті кілтке өрнектейміз

blocks = split(text, 16) // мәтінді 16-байттан тұратын блоктарға бөліп тастау

 

for (i = 0; i < blocks.length; i++)

cipher[i] = encrypt(blocks[i], key)

Сipher блоктар масссивын кері шифрлеу үшін әр блокқа decrypt қолдану керек:

 

hash = md5(password)

key = keyexpansion(hash)

 

for (i = 0; i < cipher.length; i++)

blocks[i] = decrypt(cipher[i], key)

 

text = merge(blocks) // барлық блоктарды бір жолға байланыстыру


Әрине, мәтіннің ұзындығы 128-биттен қысқа болмауы керек. Мұндай жағдайда мәтінге нөлдерді қажет ұзындыққа дейін қосуға болады, ал шифрленген мәліметтерге біртума мәтіннің шифрленген мөлшеріне бірнеше байт қосуға болады. Аes.js файлындағы мысалда aes.encrypt және aes.decrypt функцияларын қолданады.

 

GF(28) өрісі

AES түпкі өріс GF(28) деп аталатын өрісті белсенді қолданады.

GF(28) өрісі бұл 0..255 сандар, олар үшін ерекше қосу және ерекше көбейту анықтады. Осы өрістен қандай да бір сан алайық және оны сегіз биттік деп бейнелейік: a = a7a6a5a4a3a2a1a0. Дәл солай b санында елестетеміз. a және b қосындысы бұл белгілі әрбиттік операция xor:

а + b = a xor b

 

Қосындының қарапайым қасиеттері бар:

a + a = 0
-a = 0 - a = a
a - b = a + (-b) = a + b

Көбейту қиынырақ анықталады. Көпмүшеліктерді мына сандар биттерінің коэффициенттерімен жазамыз:

p = a7x7 + a6x6 + a5x5 + a4x4 + a3x3 + a2x2 + a1x + a0
q = b7x7 + b6x6 + b5x5 + b4x4 + b3x3 + b2x2 + b1x + b0

Енді осы екі көпмүшелікті көбейтеміз және m-ге бөлгендегі қалдығын табамыз:

 

m = x8 + x4 + x3 + x + 1
r = pq mod (m)

 

Неге осындай m таңдалынды? Бұл көпмүшелікте қалдықсыз бөленетін екі бөлетін-көпмүшелігі бар: бірлік және оның өзі. Аналогия бойынша жай сандармен көпмүшелік m «қарапайым». Сонымен қатар бөлгеннен шыққан қалдықтар кәдімгі сандардан табуға болады: ол үшін көпмүшеліктерді көбейту, қалау және алу білу жеткілікті, және де қосу мен алуды GF(28) ережесімен шығарады, яғни көпмүшеліктерді қосу мен бөлу бұл әр жұп коэффициенттер арасындағы xor.

Міне екі мысал:

x3 + x2 + 1 mod (x3 + 1) = x2 // x3+1 бір рет алу қажет
x3 + x2 + 1 mod (x2 + 1) = (x3 + x2 + 1) - (x + 1)(x2 + 1) = -x


Көпмүшелік r былай көрсетейік:

r = r7x7 + r6x6 + r5x5 + r4x4 + r3x3 + r2x2 + r1x + r0


Оның 8 коэффициенттері өзімен GF(28) өрісінің 8-биттік санын көрсетеді және бұл сан a•b шығармасы деп аталынады. Қосуға қарағанда көбейтуді жұпты қарапайым әрбиттік операциялармен табуға болмайды. Бірақ GF(28) өрісіндегі кез келген көпмүшеге көбейтуді х көпмүшеге көбейтіндісін түйістіруге болады, ал х-ке бірнеше әрбиттік операциялармен көбейтуге болады.

Көпмүшеліктерді белгілеу үшін GF(28)-те 16-лық сандар қолданады. Мысалы:

 

m = x8 + x4 + x3 + x + 1 = 100011011 = 0x011b = {01}{1b}


GF(28) өрісінде көпмүшелікке x = {02} көбейту өте оңай. Шығарылуын қарастырайық:


xp = x(a7x7 + a6x6 + a5x5 + a4x4 + a3x3 + a2x2 + a1x + a0) =
a7x8 + a6x7 + a5x6 + a4x5 + a3x4 + a2x3 + a1x<2 + a0x
p = a7a6a5a4a3a2a1a0
xp = a7a6a5a4a3a2a1a00 // бұл солға қарай бір битке жылжу


Енді m-ге бөлгендегі қалдықты табу. Егер бит a7 = 1 болса, онда бір рет m-ді алу керек. Сонымен:


r = xp mod (m) = xp - m егер a7 = 1
r = xp mod (m) = xp егер a7 = 0


x –ке көбейтуді мнадай функциямен жазуға болады:


gf.xtime = function(b)

{

var highbit = b & 0x80

var shl = (b << 1) & 0xff

return highbit == 0 ? shl : shl ^ 0x1b

}

 

x-ке көбейтуді біле тұра кез келген басқа көпмүшеге көбейтуге болады. Мысал үшін a•b табамыз онда a = {3c}, b = {a1}:

b = {a1} = 10100001 = {80} + {20} + {01}
a•b = a•{80} + a•{20} + a•{01} = a•x7 + a•x5 + a =
a•{02}•{02}•{02}•{02}•{02}•{02}•{02} + a•{02}•{02}•{02}•{02}•{02} + a =
{29} + {c1} + {3c} = {d4}

GF(28) өрісінде бір ғана жай перация қалды. Кез келген b байтта, нөлден басқа, a•b = {01} қасиеті бар a = b-1 кері байты болады.

S-Box кестесі

 

Бұл кесте өзімен 256-байтты массив көрсетеді және бір байтты келесіне ауыстыру үшін қоладанылады. Оның қалай шығатынын түсініп керек емес, себебі кодқа осы массивті көшіріп алса болғаны. SBox[b] элементі неге тең екенін білү ушін үш әрекет қажет:

 

1. GF(28) өрісінде b –ға кері байт табу (нөлді өзгеріссіз қалдыру)

2. Сегіз биттен тұратын нәтижені 64 биттен тұратын 8×8 матрицасына көбейту керек

3. {63}-ті қосу қажет

 

Сомада бұл үш әрекет сергектік өрнектеу береді:



Биттерден құралған матрицаның қалай құралғанын түсіну қиын емес. Биттерді көбейту үшін - «and», қосу үшін - «xor» қолдану қажет. Мысалы:

 

r0 = b0 + b4 + b5 + b6 + b7 + 1

sbox функциясын былай жазуға болады:


aes.sbox = function(b)

{

var m = 0xf8

var r = 0

var q = gf.inv(b) || 0

 

for (var i = 0; i < 8; i++)

{

r = (r << 1) | bits.xorbits(q & m)

m = (m >> 1) | ((m & 1) << 7)

}

 

return r ^ 0x63

}

 

Құрылған кесте былай болады:

 


63 7c 77 7b f2 6b 6f c5 30 01 67 2b fe d7 ab 76
ca 82 c9 7d fa 59 47 f0 ad d4 a2 af 9c a4 72 c0
b7 fd 93 26 36 3f f7 cc 34 a5 e5 f1 71 d8 31 15
04 c7 23 c3 18 96 05 9a 07 12 80 e2 eb 27 b2 75
09 83 2c 1a 1b 6e 5a a0 52 3b d6 b3 29 e3 2f 84
53 d1 00 ed 20 fc b1 5b 6a cb be 39 4a 4c 58 cf
d0 ef aa fb 43 4d 33 85 45 f9 02 7f 50 3c 9f a8
51 a3 40 8f 92 9d 38 f5 bc b6 da 21 10 ff f3 d2
cd 0c 13 ec 5f 97 44 17 c4 a7 7e 3d 64 5d 19 73
60 81 4f dc 22 2a 90 88 46 ee b8 14 de 5e 0b db
e0 32 3a 0a 49 06 24 5c c2 d3 ac 62 91 95 e4 79
e7 c8 37 6d 8d d5 4e a9 6c 56 f4 ea 65 7a ae 08
ba 78 25 2e 1c a6 b4 c6 e8 dd 74 1f 4b bd 8b 8a
70 3e b5 66 48 03 f6 0e 61 35 57 b9 86 c1 1d 9e
e1 f8 98 11 69 d9 8e 94 9b 1e 87 e9 ce 55 28 df
8c a1 89 0d bf e6 42 68 41 99 2d 0f b0 54 bb 16


Оны әдеттегідей кодқа көшіріп алуға болады, sbox функциясымен табуға болады.

 

InvSBox кестесі


AES мәтінін кері шифрлеу үшін SBox-қа кері кестені қолданады. AES мәтінін кері шифрлеу үшін Sbox-қа кері кестені қолданады. InvSBox кестесінде тек бір ғана қасиеті InvSBox[SBox[i]] = i. InvSBox былай жазылады:

52 09 6a d5 30 36 a5 38 bf 40 a3 9e 81 f3 d7 fb
7c e3 39 82 9b 2f ff 87 34 8e 43 44 c4 de e9 cb
54 7b 94 32 a6 c2 23 3d ee 4c 95 0b 42 fa c3 4e
08 2e a1 66 28 d9 24 b2 76 5b a2 49 6d 8b d1 25
72 f8 f6 64 86 68 98 16 d4 a4 5c cc 5d 65 b6 92
6c 70 48 50 fd ed b9 da 5e 15 46 57 a7 8d 9d 84
90 d8 ab 00 8c bc d3 0a f7 e4 58 05 b8 b3 45 06
d0 2c 1e 8f ca 3f 0f 02 c1 af bd 03 01 13 8a 6b
3a 91 11 41 4f 67 dc ea 97 f2 cf ce f0 b4 e6 73
96 ac 74 22 e7 ad 35 85 e2 f9 37 e8 1c 75 df 6e
47 f1 1a 71 1d 29 c5 89 6f b7 62 0e aa 18 be 1b
fc 56 3e 4b c6 d2 79 20 9a db c0 fe 78 cd 5a f4
1f dd a8 33 88 07 c7 31 b1 12 10 59 27 80 ec 5f
60 51 7f a9 19 b5 4a 0d 2d e5 7a 9f 93 c9 9c ef
a0 e0 3b 4d ae 2a f5 b0 c8 eb bb 3c 83 53 99 61
17 2b 04 7e ba 77 d6 26 e1 69 14 63 55 21 0c 7d

 

 



Просмотров 1113

Эта страница нарушает авторские права




allrefrs.su - 2024 год. Все права принадлежат их авторам!