void aes_enc(uint8_t state[16],uint8_t cipher[16],uint8_t ekey[240]) { uint8_t iteration = 0; uint8_t x,y; uint8_t sub[4][4]; uint8_t shift[4][4]; uint8_t mix[4][4]; uint8_t round[4][4]; uint8_t state_grid[4][4]; uint8_t result[4][4]; state_grid[0][0] = state[0]; state_grid[0][1] = state[1]; state_grid[0][2] = state[2]; state_grid[0][3] = state[3]; state_grid[1][0] = state[4]; state_grid[1][1] = state[5]; state_grid[1][2] = state[6]; state_grid[1][3] = state[7]; state_grid[2][0] = state[8]; state_grid[2][1] = state[9]; state_grid[2][2] = state[10]; state_grid[2][3] = state[11]; state_grid[3][0] = state[12]; state_grid[3][1] = state[13]; state_grid[3][2] = state[14]; state_grid[3][3] = state[15]; addroundkey(state_grid,0,sub,ekey); loop_main : for(iteration = 1; iteration < nr; iteration++) { subbytes(sub,shift); shift_row_enc(shift,mix); mixcolumn(mix,round); addroundkey(round,iteration,sub,ekey); } subbytes(sub,shift); shift_row_enc(shift,round); addroundkey(round,nr,result,ekey); cipher[0] = result[0][0]; cipher[1] = result[0][1]; cipher[2] = result[0][2]; cipher[3] = result[0][3]; cipher[4] = result[1][0]; cipher[5] = result[1][1]; cipher[6] = result[1][2]; cipher[7] = result[1][3]; cipher[8] = result[2][0]; cipher[9] = result[2][1]; cipher[10] = result[2][2]; cipher[11] = result[2][3]; cipher[12] = result[3][0]; cipher[13] = result[3][1]; cipher[14] = result[3][2]; cipher[15] = result[3][3]; }
int main(){ int rounds, i, j, count, numberround; char plaintext[17] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'}; char key[17] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'}; char index[16][3]; char indexkey[16][3]; char b[3], a[3]; printf("Input Text: "); gets(plaintext); printf("Input Key: "); scanf(" %[^\n]s\n", key); rounds = ceil(strlen(plaintext)/16); for(i=0; i<16; i++){ sprintf(a, "%x", plaintext[i]); /* keep char ascii to hex base */ sprintf(b, "%x", key[i]); strcpy(index[i], a); strcpy(indexkey[i], b); } for(numberround=1; numberround<=10; numberround++){ if(numberround==1){ sub_byte_key(indexkey); roundkey(matrixkey); } else{ roundkey(matrixkey); } sub_byte(index); printf("roundkey:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrixkey[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); printf("Subbyte:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); shiftrow(); printf("shiftrow value:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); if(numberround<10){ mixcolumn(); printf("mixcolumn value:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } } printf("-------------------------------------------\n"); addroundkey(); printf("Addroundkey value:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%c", cipher[i][j]); } } printf("\n"); } /* for(i=0; i<16; i++){ sprintf(a, "%x", plaintext[i]); //keep char ascii to hex base sprintf(b, "%x", key[i]); strcpy(index[i], a); strcpy(indexkey[i], b); } roundkey(indexkey); sub_byte(index); printf("matrixkey:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrixkey[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); printf("matrix:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); shiftrow(); printf("shiftrow value:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); mixcolumn(); printf("mixcolumn value:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); addroundkey(); printf("Addroundkey value:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } */ }
int main(){ int rounds, i, j, count, numberround, answer, rconround = 0, subbyteround = 0;; char plaintext[17] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'}; char key[17] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'}; char index[16][3]; char indexkey[16][3]; char b[3], a[3]; printf("Input Text: "); gets(plaintext); printf("Input Key: "); scanf(" %[^\n]s\n", key); rounds = ceil(strlen(plaintext)/16); for(i=0; i<16; i++){ sprintf(a, "%x", plaintext[i]); /* keep char ascii to hex base */ sprintf(b, "%x", key[i]); strcpy(index[i], a); strcpy(indexkey[i], b); //printf("%x\n", index[i]); //printf("%s\n", indexkey[i]); } for(i=0; i<16; i++){//we do add round key first before do 10 loop //printf("%d\n", (((tonum(index[i][0]))*10)+(tonum(index[i][1])))); answer = (((tonum(index[i][0]))*10)+(tonum(index[i][1])))^(((tonum(indexkey[i][0]))*10)+(tonum(indexkey[i][1]))); printf("%d\n", answer); sprintf(a, "%x", answer); printf("%s\n", a); strcpy(index[i], a); //printf("%s\n", index[i]); } for(numberround=1; numberround<=10; numberround++){ printf("%d %d\n", rconround,subbyteround); if(numberround==1){ sub_byte_key(indexkey); roundkey(matrixkey, rconround); } else{ roundkey(matrixkey, rconround); } sub_byte(index, subbyteround); printf("roundkey:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrixkey[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); printf("Subbyte:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); shiftrow(); printf("shiftrow value:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } printf("-------------------------------------------\n"); if(numberround<10){ mixcolumn(); printf("mixcolumn value:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%x ", matrix[i][j]); } printf("\n"); } } printf("-------------------------------------------\n"); addroundkey(); printf("Addroundkey value:\n"); for(i=0; i<4; i++){ for(j=0; j<4; j++){ printf("%c", matrix[j][i]); } //printf("\n"); } printf("\n"); subbyteround++; rconround++; } }
int main () { int i,j; unsigned char state[4][4] = {{0x32,0x88,0x31,0xE0},{0x43,0x5A,0x31,0x37},{0xF6,0x30,0x98,0x07},{0xa8,0x8D,0xA2,0x34}}; unsigned char key[4][4]={{0x2B,0x28,0xAB,0x09},{0x7E,0xAE,0xF7,0xCF},{0x15,0xD2,0x15,0x4F},{0x16,0xA6,0x88,0x3C}}; unsigned char expan_key[4][44]; unsigned char temp[4][4]; //============1. Read user text into matrix================= //=== print(state); printf("\n KEY IN HEX \n"); print(key); printf("\n"); printf("\n"); key_generate(key,expan_key); printf("\n"); printf("\n"); //=================2. Add round key Correct ================ Add_key(state,key); printf("\n AFTER ADDING ROUND KEY \n"); print(state); int start=4; int loop; unsigned char temp_key[4][4]; //=================3. n round ================ for(loop=1;loop<11;loop++) { printf("\n State %d \n",loop); print(state); for(i=0;i<4;i++) { for(j=0;j<4;j++) { temp_key[j][i]=expan_key[j][loop*start+i]; } } printf("\n key %d \n",loop); print(temp_key); //=================3.a. SubByte ================ subByte(state); printf("\n AFTER SubByte\n"); print(state); printf("\n"); //=================3.b. Shift raw Correct ================ shiftRaw(state); printf("\n AFTER shift raw \n"); print(state); printf("\n"); //=================3.c. mix Column Correct ================ if(loop!=10) { mixcolumn(state,temp); printf("\n AFTER MIX COLUMN \n"); for(j=0;j<4;j++) { for (i=0;i<4;i++) { state[j][i]=temp[j][i]; } } } print(state); //=================3.d. Add round key ================ Add_key(state,temp_key); printf("\n AFTER ADDING ROUND KEY %d\n",loop); print(state); printf("\n"); } return 0; }