Untitled
unknown
plain_text
14 days ago
11 kB
2
Indexable
Never
#include<stdio.h> #include<stdlib.h> #include<stdint.h> #include<string.h> #include<time.h> uint8_t GF_MUL(uint8_t a,uint8_t b){ uint8_t p=0; uint8_t hi_bit_set; for(int i=0;i<8;i++){ if(b & 1) p^=a; hi_bit_set = (a & 0x80); a <<= 1; if(hi_bit_set) a ^= 0x1B; b >>= 1; } return p; } const uint8_t sBox[256] = { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 }; const uint8_t invSBox[256] = { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D }; const uint8_t rcon[15] = { 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36, 0x6C, 0xD8, 0xAB, 0x4D }; void string_to_hex(uint8_t* string, char* hex, char string_len){ for(int i = 0; i<string_len; i++){ sprintf_s(hex + 2 * i, 4, "%02x", string[i]); } hex[string_len*2]=0; } void hex_to_string(const char* hex, char* string, int hex_len){ int val; for(int i=0; i<hex_len/2; i++){ sscanf(hex + 2 * i, "%2x", &val); string[i]=(char)val; } string[hex_len/2]=0; } void padding(char *input) { for (int i = strlen(input);i <= strlen(input) + 16;i++) input[i] = 0; } void KeyExpansion(uint8_t* key, uint8_t w[15][4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { w[0][i][j] = key[i * 4 + j]; } } for (int i = 1; i <= 14; i++) { for (int j = 0; j < 4; j++) { w[i][0][j] = w[i - 1][0][j] ^ sBox[w[i - 1][1][j]] ^ rcon[i]; for (int k = 1; k < 4; k++) { w[i][k][j] = w[i - 1][k][j] ^ w[i][k - 1][j]; } } } } void generateKey_256(uint8_t* key, int length) { srand(time(NULL)); for (int i = 0;i < length*2;i++){ int r = rand() % 256; if(r/16<=9) key[i]=r/16+'0'; else key[i]=r/16+'A'-10; i++; if(r%16<=9) key[i]=r%16+'0'; else key[i]=r%16+'A'-10; } key[length*2]=0; } void generateIV(uint8_t* iv, int length) { srand(time(NULL)); for (int i = 0;i < length;i++) iv[i] = rand() % 256; } void subBytes(uint8_t state[4][4]) { for (int i = 0;i < 4;i++) for (int j = 0;j < 4;j++) state[i][j] = sBox[state[i][j]]; } void shiftRow(uint8_t state[4][4]) { for (int i = 1;i < 4;i++) { for (int k = 0;k < i;k++) { uint8_t temp = state[i][0]; for (int j = 0;j < 3;j++) state[i][j] = state[i][j + 1]; state[i][3] = temp; } } } void addRoundKey(uint8_t state[4][4],uint8_t roundKey[4][4]) { for (int i = 0;i < 4;i++) for (int j = 0;j < 4;j++) state[i][j] ^= roundKey[i][j]; } void mixColumns(uint8_t state[4][4]) { uint8_t temp[4][4]; for (int j = 0; j < 4; j++) { temp[0][j] = GF_MUL(0x02, state[0][j]) ^ GF_MUL(0x03, state[1][j]) ^ state[2][j] ^ state[3][j]; temp[1][j] = state[0][j] ^ GF_MUL(0x02, state[1][j]) ^ GF_MUL(0x03, state[2][j]) ^ state[3][j]; temp[2][j] = state[0][j] ^ state[1][j] ^ GF_MUL(0x02, state[2][j]) ^ GF_MUL(0x03, state[3][j]); temp[3][j] = GF_MUL(0x03, state[0][j]) ^ state[1][j] ^ state[2][j] ^ GF_MUL(0x02, state[3][j]); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { state[i][j] = temp[i][j]; } } } void invSubBytes(uint8_t state[4][4]) { for (int i = 0;i < 4;i++) for (int j = 0;j < 4;j++) state[i][j] = invSBox[state[i][j]]; } void invShiftRow(uint8_t state[4][4]) { for (int i = 1;i < 4;i++) { for (int k = 0;k < i;k++) { uint8_t temp = state[i][3]; for (int j = 3;j > 0;j--) state[i][j] = state[i][j - 1]; state[i][0] = temp; } } } void invMixColumns(uint8_t state[4][4]){ uint8_t temp[4][4]; for (int j = 0; j < 4; j++) { temp[0][j] = GF_MUL(0x0E, state[0][j]) ^ GF_MUL(0x0B, state[1][j]) ^ GF_MUL(0x0D,state[2][j]) ^ GF_MUL(0x09,state[3][j]); temp[1][j] = GF_MUL(0x09, state[0][j]) ^ GF_MUL(0x0E, state[1][j]) ^ GF_MUL(0x0B,state[2][j]) ^ GF_MUL(0x0D,state[3][j]); temp[2][j] = GF_MUL(0x0D, state[0][j]) ^ GF_MUL(0x09, state[1][j]) ^ GF_MUL(0x0E,state[2][j]) ^ GF_MUL(0x0B,state[3][j]); temp[3][j] = GF_MUL(0x0B, state[0][j]) ^ GF_MUL(0x0D, state[1][j]) ^ GF_MUL(0x09,state[2][j]) ^ GF_MUL(0x0E,state[3][j]); } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { state[i][j] = temp[i][j]; } } } void enCrypt_AES(char* input, uint8_t* keyHex, char output[256]) { uint8_t iv[16]; uint8_t state[4][4]; uint8_t roundKey[15][4][4]; uint8_t cipherText[256]; uint8_t* key = (uint8_t*) malloc(33); for(int i=0;keyHex[i]!=0;i++){ if(keyHex[i]<='9') key[i/2]=keyHex[i]-'0'; else key[i/2]=keyHex[i]-'A'+10; i++; if(keyHex[i]<='9') key[i/2]=key[i/2]*16+keyHex[i]-'0'; else key[i/2]=key[i/2]*16+keyHex[i]-'A'+10; } KeyExpansion(key, roundKey); int len = ((strlen(input) + 16) / 16) * 16; generateIV(iv, 16); for (int i = 0;i < 16;i++) cipherText[i] = iv[i]; padding(input); for (int block = 0;block < (strlen(input) + 16) / 16;block++) { if (block == 0) { for (int i = 0;i < 16;i++) state[i / 4][i % 4] = iv[i] ^ input[i]; } else { for (int i = block*16;i < block*16+16;i++) state[(i / 4)%4][i % 4] = cipherText[i] ^ input[i]; } addRoundKey(state, roundKey[0]); for (int loop = 1;loop < 14;loop++) { subBytes(state); shiftRow(state); mixColumns(state); addRoundKey(state, roundKey[loop]); } subBytes(state); shiftRow(state); addRoundKey(state, roundKey[14]); for (int i = block * 16;i < block * 16 + 16;i++) cipherText[i+16] = state[(i / 4)%4][i % 4]; } string_to_hex(cipherText,output,len+16); } void deCrypt_AES(char* plaintext, uint8_t* keyHex, char* output){ uint8_t* key = (uint8_t*) malloc(33); for(int i=0;keyHex[i]!=0;i++){ if(keyHex[i]<='9') key[i/2]=keyHex[i]-'0'; else key[i/2]=keyHex[i]-'A'+10; i++; if(keyHex[i]<='9') key[i/2]=key[i/2]*16+keyHex[i]-'0'; else key[i/2]=key[i/2]*16+keyHex[i]-'A'+10; } char input[256]; hex_to_string(plaintext, input, strlen(plaintext)); uint8_t iv[16]; uint8_t roundKey[15][4][4]; KeyExpansion(key,roundKey); for(int i=0;i<16;i++) iv[i]=input[i]; int blockCount=strlen(plaintext)/32; uint8_t state[4][4]; for(int block=blockCount-1; block>0; block--){ for(int i=block*16; i<block*16+16; i++){ state[(i/4)%4][i%4]=input[i]; } addRoundKey(state, roundKey[14]); for(int loop=13;loop>0;loop--){ invShiftRow(state); invSubBytes(state); addRoundKey(state,roundKey[loop]); invMixColumns(state); } invShiftRow(state); invSubBytes(state); addRoundKey(state,roundKey[0]); if(block==1) for(int i=0;i<16;i++) output[i]=iv[i]^state[i/4][i%4]; else{ for(int i=block*16;i<block*16+16;i++) output[i-16]=input[i-16]^state[(i/4)%4][i%4]; } } } int main() { uint8_t key[65]; generateKey_256(key, 32); char plaintext[256] = "Hello world!! Hello world!! Hello world!! Hello world!! Hello world!!\0"; char output[256]; enCrypt_AES(plaintext, key, output); printf("%s\n",output); char plaintext2[256]; deCrypt_AES(output,key,plaintext2); printf("%s\n",plaintext2); return 0; }
Leave a Comment