Chương trình C/C++ Mã hóa và giải mã thuật toán AES bằng Sbox động

20 28 0
Chương trình C/C++  Mã hóa và giải mã thuật toán AES bằng Sbox động

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Chương trình mã hóa, giải mã bằng thuật toán AES với khóa 128, 192, 256 bit với Sbox động và ngôn ngữ lập trình CC++Chương trình gồm 3 chức năng chính: Tạo Sbox động bằng sự thay đổi của đa thức bất khả quy Mã hóa bản rõ bằng thuật toán AES với khóa: 128, 192 và 256 bit Giải mã bằng thuật toán AES với khóa: 128, 192 và 256 bit Mã hóa và giải mã AES sử dụng Sbox động được tạo từ chức năng 1 thay vì Sbox tĩnh thường dùng để nâng cao độ an toàn của thuật toán.

Mục lục Chức chương trình .1 Cấu trúc chương trình Sbox.h .2 Sbox.cpp AES.cpp Test.txt 19 Chức chương trình Chương trình gồm chức chính: - Tạo Sbox động thay đổi đa thức bất khả quy - Mã hóa rõ thuật tốn AES với khóa: 128, 192 và 256 bit - Giải mã thuật tốn AES với khóa: 128, 192 và 256 bit ** Mã hóa giải mã AES sử dụng Sbox động tạo từ chức thay Sbox tĩnh thường dùng để nâng cao độ an toàn thuật tốn Cấu trúc chương trình - Sbox.h: Thư viện định nghĩa hàm file Sbox.cpp - Sbox.cpp: Viết hàm menu, hàm kiểm tra đầu vào, hàm tạo sbox động - AES.cpp: Bao gồm hàm mã hóa giải mã AES - Test.txt: Bao gồm ví dụ khóa 128, 192, 256 bit rõ để chạy chương trình ************************ Mã nguồn C/C++******************** Sbox.h #include #include #include #include #include #include #include #include #include #include typedef unsigned char uc; void initialize(short irrPol,uc sbox[16*16]); uc msb(unsigned short num); uc divide(unsigned short a, uc b, uc &r); uc multiply(uc a, uc b); uc inverse(uc b,short irrPol); uc map (uc a); int  s_box_gen(short irrPol,uc sbox[16*16]); void inv_s_box_gen(uc sbox[16*16],uc invsbox[16*16]); int generate_sbox(uc Key[], uc sbox[16*16], int Key_len); void menu(); int chon(); int checkinput(char input[]); int checkkey(char input[]); Sbox.cpp #include "sbox.h" // Khởi tạo Sbox void initialize(short irrPol, uc sbox[16 * 16]) {     uc i, j;     for (i = 0; i > ((i + 7) % 8)) & 0x1) ^ ((c >> i) & 0x1);         res = res | (temp 4);     y = (unsigned char)((int)(*p) & 0x0f);     *p = sbox[x * 16 + y];     p++;     x = (unsigned char)((int)(*p) >> 4);     y = (unsigned char)((int)(*p) & 0x0f);     *p = sbox[x * 16 + y];     p++;     x = (unsigned char)((int)(*p) >> 4);     y = (unsigned char)((int)(*p) & 0x0f);     *p = sbox[x * 16 + y];     return t; } void KeyExpantion(unsigned char *key, unsigned char *w) {     /* Nk*4 byte dau duoc lay tu khoa vao -> duoc Nk dong */     for (int i = 0; i < Nk; i++)     { /* theo dong */         w[i * 4] = key[i * 4];         w[i * + 1] = key[i * + 1];         w[i * + 2] = key[i * + 2];         w[i * + 3] = key[i * + 3];     }     /* Tu dong thu Nk den 4*(Nr+1)*4 */     for (int row = Nk; row < (4 * (Nr + 1)); row++)     {         unsigned long temp = *((unsigned long *)&w[(row - 1) * 4]); /* W[i-1] = w[4*(i-1)]*/         if (row % Nk == 0)         {             temp = SubWord(RotWord(temp)) ^ (*((unsigned long *)&Rcon[(row / Nk) * 11]));         }         else if (Nk > && (row % Nk == 4))         {             temp = SubWord(temp);         }         temp = temp ^ (*((unsigned long *)(&w[(row - Nk) * 4])));         /* Ghi lai byte vao w ung voi dong khoa thu row*/         *((unsigned long *)&w[row * 4]) = temp;     } } /* Cong State voi khoa vong thu round */ void AddRoundKey(int round) {     for (int i = 0; i < 4; i++)     /* cot */         for (int j = 0; j < 4; j++) /* hang */         {             state[i * + j] = (unsigned char)((int)state[i * + j] ^ (int)w[(round * + j) * + i]);         } } /* MixColumns */ void MixColumns(void) {     unsigned char temp[4 * 4];     /* Copy du lieu tu State vao temp */     for (int i = 0; i < 4; i++)         for (int j = 0; j < 4; j++)         {             temp[i * + j] = state[i * + j];         }     for (int i = 0; i < 4; i++)     {         /* Nhan cot thu i voi da thuc            c(x) = '03h'x^3 + '01h'x^2 + '01h'x + '02h'          */         /* b'[0] = 02*b[0] + 03*b[1] + b[2] + b[3] */         state[0 * + i] = (unsigned char)((int)gfMultBy02(temp[0                                            (int)gfMultBy03(temp[1                                            (int)temp[2 * + i] ^                                            (int)temp[3 * + i]);         /* b'[1] = b[0] + 02*b[1] + 03*b[2] + b[3] */         state[1 * + i] = (unsigned char)((int)temp[0 * + i] ^                                            (int)gfMultBy02(temp[1                                            (int)gfMultBy03(temp[2                                            (int)temp[3 * + i]);         /* b'[2] = b[0] + b[1] + 02*b[2] + 03*b[3] */         state[2 * + i] = (unsigned char)((int)temp[0 * + i] ^                                            (int)temp[1 * + i] ^                                            (int)gfMultBy02(temp[2                                            (int)gfMultBy03(temp[3         /* b'[3] = 03*b[0] + b[1] + 01*b[2] + 02*b[3] */         state[3 * + i] = (unsigned char)((int)gfMultBy03(temp[0                                            (int)temp[1 * + i] ^                                            (int)temp[2 * + i] ^                                            (int)gfMultBy02(temp[3     } } void AES_Cipher(unsigned char *input, unsigned char *output) {     /* Neu khong co du lieu vao -> THOAT */     if ((input == NULL) || (output == NULL))         return;     /* Dua input vao State */     for (int i = 0; i < 16; i++)     { /* theo cot truoc */         state[(i % 4) * + (i / 4)] = input[i];     }     AddRoundKey(0);     /* Thuc hien Nr vong lap */     for (int round = 1; round >4);             //            y= (unsigned char)((int)(state[i*4+j])&0x0f);             state[i * + j] = invsbox1[state[i * + j]];         } } void InvMixColumns(void) {     unsigned char temp[4 * 4];     for (int i = 0; i < 4; i++)         for (int j = 0; j < 4; j++)         {             temp[i * + j] = state[i * + j];         }     for (int i = 0; i < 4; i++)     {         /* Nhan cot thu i voi da thuc            d(x) = '0bh'x^3 + '0dh'x^2 + '09h'x + '0eh'          */         /* b'[0] = 0e*b[0] + 0b*b[1] + 0d*b[2] + 09*b[3] */         state[0 * + i] = (unsigned char)((int)gfMultBy0e(temp[0 * + i]) ^                                            (int)gfMultBy0b(temp[1 * + i]) ^                                            (int)gfMultBy0d(temp[2 * + i]) ^                                            (int)gfMultBy09(temp[3 * + i]));         /* b'[1] = 09*b[0] + 0e*b[1] + 0b*b[2] + 0d*b[3] */         state[1 * + i] = (unsigned char)((int)gfMultBy09(temp[0 * + i]) ^                                            (int)gfMultBy0e(temp[1 * + i]) ^                                            (int)gfMultBy0b(temp[2 * + i]) ^                                            (int)gfMultBy0d(temp[3 * + i]));         /* b'[2] = 0d*b[0] + 09*b[1] + 0e*b[2] + 0b*b[3] */         state[2 * + i] = (unsigned char)((int)gfMultBy0d(temp[0 * + i]) ^                                            (int)gfMultBy09(temp[1 * + i]) ^                                            (int)gfMultBy0e(temp[2 * + i]) ^                                            (int)gfMultBy0b(temp[3 * + i]));         /* b'[3] = 0b*b[0] + 0d*b[1] + 09*b[2] + 0e*b[3] */         state[3 * + i] = (unsigned char)((int)gfMultBy0b(temp[0 * + i]) ^                                            (int)gfMultBy0d(temp[1 * + i]) ^                                            (int)gfMultBy09(temp[2 * + i]) ^                                            (int)gfMultBy0e(temp[3 * + i]));     } } // Ham thuc hien giai ma AES void InvAES_Cipher(unsigned char *input, unsigned char *output, uc invsbox1[16 * 16]) {     /* Neu input hoac output chua khoi tao -> THOAT */ 11     if (input == NULL || output == NULL)         return;     /* Dua input vao State */     for (int i = 0; i < 16; i++)     { /* theo cot */         state[(i % 4) * + (i / 4)] = input[i];     }     /* AddRoundKey - Khoa cua vong thu Nr*/     AddRoundKey(Nr);     /* Thuc hien Nr vong lap nguoc */     for (int round = Nr - 1; round >= 1; round)     {         InvShiftRows();         InvSubBytes(invsbox1);         AddRoundKey(round);         InvMixColumns();     }     /* Final Round */     InvShiftRows();     InvSubBytes(invsbox);     AddRoundKey(0);     /* Lay du lieu - theo cot*/     for (int i = 0; i < 16; i++)     {         output[i] = state[(i % 4) * + (i / 4)];     } } void SetNkNr(int key_len) {    if (key_len == 16){       Nk = 4;       Nr = 10;       printf ("\n\t\t\t - AES-128 ");    }    else if (key_len == 24){       Nk = 6;       Nr = 12;       printf ("\n\t\t\t - AES-192 ");    }    else if (key_len == 32){       Nk = 8;       Nr = 14;       printf ("\n\t\t\t - AES-256 ");    } } // -Chương trình thực nghiệm // // Chức 1: Tạo S-box động phụ thuộc khóa dựa biế n đổ i đa thức bấ t khả quy void genSbox() {     uc sbox[16 * 16],Key[16];     char Key_str[65];     int i;     printf("\t\t\tNhap Khoa: ");     int key_len = checkkey(Key_str);     if (key_len  != 1)     {         for (i = 0; i < key_len; i++)         {             sscanf(Key_str + * i, "%02x", &Key[i]);         }         generate_sbox(Key,sbox,key_len);// Tạo S-box phụ thuộc khóa         printf("\t\t\tSbox da duoc tao!"); 12     }     else printf("\t\t\tKhoa sai dinh dang! : %d", key_len); } // Chức 2: Áp dụng thuật toán tạo S-box động vào mã hóa AES int  mahoa() {     unsigned char bro[16], bma[16], khoa[32];     char Plantext_str[50], Key_str[100];     int i;     clock_t start, finish;     double duration;       // Nhap khoa     printf("\t\t\tNhap ban ro: ");     if (checkinput(Plantext_str) != 1)     {         for (i = 0; i < (16); i++)         {             sscanf(Plantext_str + * i, "%02x", &bro[i]);         }         printf("\t\t\tNhap khoa  : ");         int key_len = checkkey(Key_str);         if (key_len != 1)         {             SetNkNr(key_len);             for (i = 0; i < key_len; i++)             {                 sscanf(Key_str + * i, "%02x", &khoa[i]);             }                         printf("\n\t\t\tBan ro: ");             for (int i = 0; i < 16; i++)                 printf("%02X", bro[i]);             printf("\n\t\t\tKhoa  : ");             for (int i = 0; i < key_len; i++)                 printf("%02X", khoa[i]);             /* - Qúa trình mã hóa sửdụng S-box động -*/             start = clock();             /* Thiế t lập S-box động phụ thuộc khóa */             generate_sbox(khoa, sbox,key_len);             /* Thiế t lập khóa phụ*/             KeyExpantion(khoa, w);             /* Gọi hàm mã hóa */             AES_Cipher(bro, bma);             /* In kế t */             printf("\n\t\t\tBan ma: ");             for (int i = 0; i < 16; i++)                 printf("%02X", bma[i]);             finish = clock();             duration = (double)(finish - start) / CLOCKS_PER_SEC;             printf("\n\t\t\tToc ma hoa: %f Kbits/seconds", ((float)250000) / duration);         }         else         {             printf ("\n\t\t\tKhoa sai dinh dang!\n");             system("pause");         }     }     else     {         printf ("\n\t\t\tBan ro sai dinh dang!\n"); 13         system("pause");             }     return 0; } // Chức 3: Áp dụng thuật toán vào giải mã AES int giaima() {     unsigned char bma[16], bdich[16], khoa[32];     char Cipher_str[100], Key_str[100];     int i;     clock_t start, finish;     double duration;       // Nhap khoa     printf("\t\t\tNhap ban ma: ");     if (checkinput(Cipher_str) != 1)     {         for (i = 0; i < 16; i++)         {             sscanf(Cipher_str + * i, "%02x", &bma[i]);         }         printf("\t\t\tNhap khoa  : ");         int key_len = checkkey(Key_str);         if (key_len != 1)         {             SetNkNr(key_len);             for (i = 0; i < key_len; i++)             {                 sscanf(Key_str + * i, "%02x", &khoa[i]);             }                         printf("\n\t\t\tBan ma: ");             for (int i = 0; i < 16; i++)                 printf("%02X", bma[i]);             printf("\n\t\t\tKhoa  : ");             for (int i = 0; i < key_len; i++)                 printf("%02X", khoa[i]);             /* - Qúa trình giải mã sửdụng S-box động -*/             start = clock();             /* Tạo bảng hốn vị ngược phụ thuộc khóa */             generate_sbox(khoa, sbox, key_len);             inv_s_box_gen(sbox, invsbox);             /* Thiế t lập khóa */             KeyExpantion(khoa, w);             /* Gọi hàm giải mã */             InvAES_Cipher(bma, bdich, invsbox);             /* In kế t */             printf("\n\t\t\tBan dich: ");             for (int i = 0; i < 16; i++)                 printf("%02X", bdich[i]);             finish = clock();             duration = (double)(finish - start) / CLOCKS_PER_SEC;             printf("\n\t\t\tToc giai ma: %f Kbits/seconds", ((float)250000) / duration);         }         else         {             printf ("\n\t\t\tKhoa sai dinh dang!\n");             system("pause");         }     } 14     else     {         printf ("\n\t\t\tBan ma sai dinh dang!\n");         system("pause");             }     return 0; } void initialize(short irrPol, uc sbox[16 * 16]) {     uc i, j;     for (i = 0; i > ((i + 7) % 8)) & 0x1) ^ ((c >> i) & 0x1);         res = res | (temp

Ngày đăng: 11/04/2023, 00:27

Tài liệu cùng người dùng

Tài liệu liên quan