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++;
	}

}	
Ejemplo n.º 4
0
Archivo: main.c Proyecto: manals/Aes
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;



}