Algoritmda 32-bitli bloklar (ikkilik vektorlar deb nomlangan) ishlatilganligi sababli, avval biz bir xil blokni aniqlaymiz:
// Blok hajmi 4 bayt (yoki 32 bit) #define BLOCK_SIZE 4 ... // vekt turini 4 baytli massiv sifatida belgilang typedef uint8_t vect;
MODUL 2 GA IKKITA IKKILIK VEKTOR QO'SHILISHI
Birinchi vektorning har bir bayti ikkinchi vektorning mos keladigan bayti bilan yoziladi va natija uchinchi (chiqish) vektoriga yoziladi:
Statik bo'shliq GOST_Magma_Add (const uint8_t * a, const uint8_t * b, uint8_t * c) (int i; for (i = 0; i)< BLOCK_SIZE; i++) c[i] = a[i]^b[i]; }
32 -MODULLI IKKITA IKKILIK VEKTORLARNING QO'SHILISHI
Bu funksiya Stribog algoritmidan "2 -modul qoldiqlari halqasida n kuchiga qo'shilish" deb nomlangan funktsiyaga o'xshaydi, bundan tashqari bizning holatlarimizda n, Stribog standartidagi kabi 512 emas, 32 bo'ladi. Ikki asl 4 baytli vektorlar ikkita 32 bitli raqamlar bilan ifodalanadi, so'ngra ular qo'shiladi, agar paydo bo'lsa, to'kish o'chiriladi:
Statik bo'shliq GOST_Magma_Add_32 (const uint8_t * a, const uint8_t * b, uint8_t * c) (int i; belgisiz int ichki = 0; uchun (i = 3; i> = 0; i--) (ichki = a [i] + b [i] + (ichki >> 8); c [i] = ichki va 0xff;))
CHIZIQLI BO'LMAGAN BIJEKTIV O'ZGARISH (T KONVERTATSIYASI)
"Stribog" va "Grasshopper" algoritmlaridan farqli o'laroq (aytmoqchi, bu o'zgarish S-transformatsiyasi deb ataladi), bu erda almashtirish jadvali boshqacha:
Statik imzosiz char Pi = ((1,7,14,13,0,5,8,3,4,15,10,6,9,12,11,2), (8,14,2,5,6 , 9,1,12,15,4,11,0,13,10,3,7), (5,13,15,6,9,2,12,10,11,7,8,1,4 , 3,14,0), (7,15,5,10,8,1,6,13,0,9,3,14,11,4,2,12), (12,8,2,1 , 13,4,15,6,7,0,10,5,3,14,9,11), (11,3,5,8,2,15,10,13,14,1,7,4 , 12,9,6,0), (6,8,2,3,9,10,5,12,1,14,4,7,11,13,0,15), (12,4,6 , 2,10,5,11,9,14,8,13,7,0,3,15,1));
Standart matnida (noma'lum an'anaga ko'ra) nol bayt oxirida, oxirgi bayt boshida yozilganligi uchun dastur to'g'ri ishlashi uchun jadval satrlari teskari tartibda yozilishi kerak, va standartda ko'rsatilganidek emas.
T konvertatsiya funktsiyasining kodi quyidagicha:
Statik bo'shliq GOST_Magma_T (const uint8_t * in_data, uint8_t * out_data) (uint8_t first_part_byte, sec_part_byte; int i; for (i = 0; i< 4; i++) { // Извлекаем первую 4-битную часть байта first_part_byte = (in_data[i] & 0xf0) >> 4; // sec_part_byte = (in_data [i] & 0x0f) baytining ikkinchi 4 bitli qismini chiqarib oling; // O'zgartirishni qidirish jadvaliga muvofiq bajaring first_part_byte = Pi; sek_part_byte = Pi; // "yopishtiruvchi" ikkala 4-bitli qismni baytga qaytaradi [i] = (birinchi_qism_bayt)<< 4) | sec_part_byte; } }
VARIANT 1. SAYTDAGI BARCHA MATERIALLARNI O'QISH UCHUN "SAYT" HAMJAMIYATIGA QO'SHILING
Belgilangan vaqt mobaynida hamjamiyatga a'zo bo'lish sizga barcha Hacker materiallariga kirishni ochadi, shaxsiy chegirmangizni oshiradi va sizga professional Xakep skorini to'plashga imkon beradi!
Do'stlaringiz bilan baham: |