![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
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) // барлық блоктарды бір жолға байланыстыру
GF(28) өрісі AES түпкі өріс GF(28) деп аталатын өрісті белсенді қолданады. GF(28) өрісі бұл 0..255 сандар, олар үшін ерекше қосу және ерекше көбейту анықтады. Осы өрістен қандай да бір сан алайық және оны сегіз биттік деп бейнелейік: a = a7a6a5a4a3a2a1a0. Дәл солай b санында елестетеміз. a және b қосындысы бұл белгілі әрбиттік операция xor: а + b = a xor b
Қосындының қарапайым қасиеттері бар: a + a = 0 Көбейту қиынырақ анықталады. Көпмүшеліктерді мына сандар биттерінің коэффициенттерімен жазамыз: p = a7x7 + a6x6 + a5x5 + a4x4 + a3x3 + a2x2 + a1x + a0 Енді осы екі көпмүшелікті көбейтеміз және m-ге бөлгендегі қалдығын табамыз:
m = x8 + x4 + x3 + x + 1
Неге осындай m таңдалынды? Бұл көпмүшелікте қалдықсыз бөленетін екі бөлетін-көпмүшелігі бар: бірлік және оның өзі. Аналогия бойынша жай сандармен көпмүшелік m «қарапайым». Сонымен қатар бөлгеннен шыққан қалдықтар кәдімгі сандардан табуға болады: ол үшін көпмүшеліктерді көбейту, қалау және алу білу жеткілікті, және де қосу мен алуды GF(28) ережесімен шығарады, яғни көпмүшеліктерді қосу мен бөлу бұл әр жұп коэффициенттер арасындағы xor. Міне екі мысал: x3 + x2 + 1 mod (x3 + 1) = x2 // x3+1 бір рет алу қажет
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.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} GF(28) өрісінде бір ғана жай перация қалды. Кез келген b байтта, нөлден басқа, a•b = {01} қасиеті бар a = b-1 кері байты болады. S-Box кестесі
Бұл кесте өзімен 256-байтты массив көрсетеді және бір байтты келесіне ауыстыру үшін қоладанылады. Оның қалай шығатынын түсініп керек емес, себебі кодқа осы массивті көшіріп алса болғаны. SBox[b] элементі неге тең екенін білү ушін үш әрекет қажет:
1. GF(28) өрісінде b –ға кері байт табу (нөлді өзгеріссіз қалдыру) 2. Сегіз биттен тұратын нәтижені 64 биттен тұратын 8×8 матрицасына көбейту керек 3. {63}-ті қосу қажет
Сомада бұл үш әрекет сергектік өрнектеу береді:
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 }
Құрылған кесте былай болады:
InvSBox кестесі
52 09 6a d5 30 36 a5 38 bf 40 a3 9e 81 f3 d7 fb
![]() |