0% found this document useful (0 votes)
39 views

My - Magic: "Magic - Instruction.h" "Movl %0, % X" "G" "Eax"

This document contains C code to implement the AES-128 encryption algorithm. It includes functions for the key expansion, substitution bytes, shift rows, mix columns, and add round key steps of AES. The code takes in a 128-bit plaintext and encryption key, performs the AES rounds, and outputs the ciphertext. It also prints the plaintext and ciphertext.

Uploaded by

Faizan Ashraf
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
39 views

My - Magic: "Magic - Instruction.h" "Movl %0, % X" "G" "Eax"

This document contains C code to implement the AES-128 encryption algorithm. It includes functions for the key expansion, substitution bytes, shift rows, mix columns, and add round key steps of AES. The code takes in a 128-bit plaintext and encryption key, performs the AES rounds, and outputs the ciphertext. It also prints the plaintext and ciphertext.

Uploaded by

Faizan Ashraf
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 4

#include<stdio.

h>
#include<conio.h>
#include "magic_instruction.h"
#define MY_MAGIC(n) \
{\
asm volatile ("movl %0, %%eax" \
: /*no outputs*/ \
: "g" (n) \
: "eax"); \
MAGIC(0); \
}
unsigned short int state[4][4];
unsigned short int RoundKey[176];
unsigned short int Rcon[11] = { 0x0, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
0x40, 0x80, 0x1b, 0x36 };
unsigned short int sbox[256] = {
//0 1 2 3 4 5 6 7 8 9 A B C D E F
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67,
0x2b, 0xfe, 0xd7, 0xab, 0x76, //0
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2,
0xaf, 0x9c, 0xa4, 0x72, 0xc0, //1
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5,
0xf1, 0x71, 0xd8, 0x31, 0x15, //2
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80,
0xe2, 0xeb, 0x27, 0xb2, 0x75, //3
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6,
0xb3, 0x29, 0xe3, 0x2f, 0x84, //4
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe,
0x39, 0x4a, 0x4c, 0x58, 0xcf, //5
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02,
0x7f, 0x50, 0x3c, 0x9f, 0xa8, //6
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda,
0x21, 0x10, 0xff, 0xf3, 0xd2, //7
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e,
0x3d, 0x64, 0x5d, 0x19, 0x73, //8
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8,
0x14, 0xde, 0x5e, 0x0b, 0xdb, //9
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac,
0x62, 0x91, 0x95, 0xe4, 0x79, //A
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4,
0xea, 0x65, 0x7a, 0xae, 0x08, //B
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74,
0x1f, 0x4b, 0xbd, 0x8b, 0x8a, //C
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57,
0xb9, 0x86, 0xc1, 0x1d, 0x9e, //D
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87,
0xe9, 0xce, 0x55, 0x28, 0xdf, //E
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d,
0x0f, 0xb0, 0x54, 0xbb, 0x16 //F
};
/*******************************************************/
unsigned char times2(unsigned short int b){
if ((b >> 7)) return ((b << 1) ^ 0x1b);
else return (b << 1);
}
/*******************************************************/
unsigned short int getSBoxValue(unsigned short int num){
return sbox[num];

}
/*****************************************************/
void aes128_ShiftRows(){
unsigned short int temp;
temp = state[1][0];
state[1][0] = state[1][1];
state[1][1] = state[1][2];
state[1][2] = state[1][3];
state[1][3] = temp;
temp = state[2][0];
state[2][0] = state[2][2];
state[2][2] = temp;
temp = state[2][1];
state[2][1] = state[2][3];
state[2][3] = temp;
temp = state[3][0];
state[3][0] = state[3][3];
state[3][3] = state[3][2];
state[3][2] = state[3][1];
state[3][1] = temp;

}
/*****************************************************/
void aes128_AddRoundKey(unsigned short int round){
int i, j;
for (i = 0; i<4; i++)
for (j = 0; j<4; j++)
state[j][i] ^= RoundKey[round * 16 + i * 4 + j];
}
/*****************************************************/
void aes128_SubBytes(){
int i, j;
for (i = 0; i<4; i++)
for (j = 0; j<4; j++)
state[i][j] = getSBoxValue(state[i][j]);
}
/*****************************************************/
void aes128_MixColumns(){
int i;
unsigned short int tmp[4];
for (i = 0; i<4; i++) {
tmp[0] =
times2(state[0][i]) ^ times2(state[1][i]) ^ state[1][i] ^ state[2][i] ^ state[3
][i];
tmp[1] =
state[0][i] ^ times2(state[1][i]) ^ times2(state[2][i]) ^ state[2][i] ^ state[3
][i];
tmp[2] =
state[0][i] ^ state[1][i] ^ times2(state[2][i]) ^ times2(state[3][i]) ^ state[3
][i];
tmp[3] =
times2(state[0][i]) ^ state[0][i] ^ state[1][i] ^ state[2][i] ^ times2(state[3]
[i]);
state[0][i] = tmp[0];
state[1][i] = tmp[1];
state[2][i] = tmp[2];
state[3][i] = tmp[3];
}

}
/*****************************************************/
void aes128_KeyExpansion(unsigned short int cipher_key[16]){
int i, j;
unsigned short int temp[4], k;
for (i = 0; i<4; i++)
{
RoundKey[i * 4] = cipher_key[i * 4];
RoundKey[i * 4 + 1] = cipher_key[i * 4 + 1];
RoundKey[i * 4 + 2] = cipher_key[i * 4 + 2];
RoundKey[i * 4 + 3] = cipher_key[i * 4 + 3];
}
for (i = 4; i<44; i++) {
for (j = 0; j<4; j++) temp[j] = RoundKey[(i - 1) * 4 + j];
if (i % 4 == 0){
k = temp[0];
temp[0] = temp[1];
temp[1] = temp[2];
temp[2] = temp[3];
temp[3] = k;
temp[0] = getSBoxValue(temp[0]);
temp[1] = getSBoxValue(temp[1]);
temp[2] = getSBoxValue(temp[2]);
temp[3] = getSBoxValue(temp[3]);
temp[0] = temp[0] ^ Rcon[i / 4];
}
RoundKey[i * 4 + 0] = RoundKey[(i - 4) * 4 + 0] ^ temp[0];
RoundKey[i * 4 + 1] = RoundKey[(i - 4) * 4 + 1] ^ temp[1];
RoundKey[i * 4 + 2] = RoundKey[(i - 4) * 4 + 2] ^ temp[2];
RoundKey[i * 4 + 3] = RoundKey[(i - 4) * 4 + 3] ^ temp[3];
}
}
/*****************************************************/
int main() {
int i, j, round;
unsigned short int cipher_key[16] = { 0x2b, 0x7e, 0x15, 0x16, 0x28,
0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c };
unsigned short int plain_text[4][4] = { 0x32, 0x88, 0x31, 0xe0,
0x43, 0x5a, 0x31, 0x37,
0xf6, 0x30, 0x98, 0x07,
0xa8, 0x8d, 0xa2, 0x34 };
printf("\nPlainText:\n");
for (i = 0; i<4; i++){
for (j = 0; j<4; j++)
printf(" %x", plain_text[i][j]);
printf("\n");
}
/**************************************************************/
//MY_MAGIC(1); //initialize simulation on processing element (PE)
for (i = 0; i<4; i++)
for (j = 0; j<4; j++)
state[i][j] = plain_text[i][j];
aes128_KeyExpansion(cipher_key);
aes128_AddRoundKey(0);
for (round = 1; round<10; round++){
aes128_SubBytes();
aes128_ShiftRows();
aes128_MixColumns();

aes128_AddRoundKey(round);
}
aes128_SubBytes();
aes128_ShiftRows();
aes128_AddRoundKey(10);
//MY_MAGIC(2); //Collect simulation data on PE
/*************************************************************/
printf("\nCipherText:\n");
for (i = 0; i<4; i++){
for (j = 0; j<4; j++)
printf(" %x", state[i][j]);
printf("\n");
_getch();
}
return 0;
_getch();
}

You might also like