Expansión de Llaves y Subbytes AES
Expansión de Llaves y Subbytes AES
Expansión de Llaves y Subbytes AES
Prctica 6:
SubBytes and Key Expansion
INTEGRANTES:
Aguirre Cruz Eder Jonathan
Sauls Cortes Jhonatan
MATERIA: Cryptography
PROFESORA: Daz Santiago Sandra
GRUPO: 3CM2
FECHA DE ENTREGA: 05 11- 2015
SubBytes
ShiftRows
MixColumns
AddRoundKey
Calcular la caja s
1.- Comenzar la s-box
00
10
20
30
.
.
.
.
.
F0
01
02
03
.................................................................... 0F
F1
F2
F3
...........................................................................FF
4.- Sumar
x^6 + x^5 + x + 1
Ejemplo:
00 es el polinomio 0 de la caja S
0= 0(x^4 + x^3 + x^2 + x + 1) mod x^2 + 1
= 0 + x^6 + x^5 + x + 1 = x^6 + x^5
0 1 1 0
6
3
+ x + 1
0 0 1 1
-> Hexadecimal
Expansin de llaves
Subllave en la ronda 7:
00 00 00 00
00 00 00 00
FF FF FF FF
FF FF FF FF
63
FF
->
40
16
23
00 = 16
FF
16
00
16
00
63
00
63
00
23
23
00
23
23
00
^ 16
= 16
00
^ 16
FF
16
E9
FF
E9
16
FF
63
9C
FF
9C
63
16
Cuarta columna
00
23
23
00
^ 16
= 16
FF
16
E9
FF
63
9C
23
16
16
63
23
16
E9
9C
23 23
16 16
16 E9
63 9C
producto= producto^polRecorrido;
}
return producto;
}
void swap(int *a ,int *b){
int aux = *a;
*a= *b;
*b=aux;
}
int InversoPolinomio(int a, int m){
int u,v,g1,g2,j,xj;
u=a;
v=m;
g1=1;
g2=0;
while(u!=1){
j=gradoPolinomio(u)-gradoPolinomio(v);
if(j<0){
swap(&v,&u);
swap(&g2,&g1);
j=(-1)*j;
}
xj=MultOperBits(1,j);
u=sumaPolinomios(u,(multiplicaPolinomios(xj,v,513)));
g1=sumaPolinomios(g1,(multiplicaPolinomios(xj,g2,513)));
}
return g1;
}
char *RepresentaPolinomio(int p){
int j=0,g;
char *pol,aux[20]={};
strcpy(pol,"");
g=gradoPolinomio(p);
for(j=0;j<=g;j++){
if(ChecaBit(p,j)==1){
sprintf(aux,"x^%d + ",j);
if((j-g)==0)
sprintf(aux,"x^%d ",j);
strcat(pol,aux);
}
}
return pol;
}
void GeneraInversos(int n, int m){
int p,i,r;
FILE *archivo;
char inv[20]={},*pol,*res,re[500]={};
if(n>=2){
p=invert(0,0,n);
printf("\n Por favor ingresa el nombre del archivo donde se
van a guardar lo inversos multiplicativos del campo con la extension
.txt: ");
scanf("%s",inv);
archivo=fopen(inv,"w");
for(i=1;i<=p;i++){
pol=RepresentaPolinomio(i);
sprintf(re,"\n El inverso del polinomio %s es =
",pol);
r=InversoPolinomio(i,m);
res=RepresentaPolinomio(r);
strcat(re,res);
printf("\n %s ",re);
fprintf(archivo,"%s",re);
}
fclose(archivo);
}
}
int concat(int a, int b){
int r;
char aux[32];
if (a >= 0 && b >= 0){
sprintf(aux, "%x%x", a, b);
sscanf(aux, "%x", &r);
}
else
r = -1;
return r;
}
void GeneraAES_Sbox(){
int i,j,r,m=283,k;
FILE *archivo,*archivo2,*archivo3;
archivo=fopen("Inicia_Sbox.txt","w");
for(i=0;i<=15;i++){
fprintf(archivo,"\n");
printf(" \n ");
for(j=0;j<=15;j++){
fprintf(archivo,"| %x%x |",i,j);
printf("| %x%x |",i,j);
}
}
fclose(archivo);
archivo2=fopen("Inversos_Sbox.txt","w");
for(i=0;i<=15;i++){
fprintf(archivo2,"\n");
printf(" \n ");
for(j=0;j<=15;j++){
k=concat(i,j);
if(k==0){
fprintf(archivo2,"| %x%x |",i,j);
printf("| %x%x |",i,j);
}
else{
r=InversoPolinomio(k,m);
fprintf(archivo2,"| %x |",r);
printf("| %x |",r);
}
}
}
fclose(archivo2);
archivo3=fopen("Sbox.txt","w");
for(i=0;i<=15;i++){
fprintf(archivo3,"\n");
printf(" \n ");
for(j=0;j<=15;j++){
k=concat(i,j);
if(k==0){
r=0;
}
else{
r=InversoPolinomio(k,m);
}
r=sumaPolinomios(99,multiplicaPolinomios(r,31,257));
fprintf(archivo3,"| %x |",r);
printf("| %x |",r);
}
}
fclose(archivo3);
}
void ExpansionKeys(char key[20]){
FILE *archivo,*archivo2;
int d=0,i=0,j=0,l=0;
char c,k[3][3],ek[3][43],ka[15];
archivo=fopen(key,"r");
archivo2=fopen("Exp_Keys.txt","w");
while(!feof(archivo)){
c=fgetc(archivo);
if(c!=32){
c=c-65;
d=concat(d,c);
}
else{
ka[i]=d;
i++;
d=0;
}
printf("| %d |",ka[i]);
}
for(i=0;i<=3;i++){
fprintf(archivo2,"\n");
printf(" \n ");
for(j=0;j<=3;j++){
k[i][j]=ka[l];
l++;
fprintf(archivo2,"| %d |",k[i][j]);
printf("| %d |",k[i][j]);
}
}
fclose(archivo);
fclose(archivo2);
}
GF(2^n): ");
scanf("%d",&n);
printf("\nIntroduce el polinomio irreducible:
");
scanf("%d",&m);
GeneraInversos(n,m);
printf("\n \n Quieres regresar al menu
SI(1)/NO(2)?: ");
scanf("%d",&g);
break;
case 4:
system("cls");
printf("\n \n Escogiste la opcion de generar la
AES - S Box");
GeneraAES_Sbox();
printf("\n \n Quieres regresar al menu
SI(1)/NO(2)?: ");
scanf("%d",&g);
break;
case 5:
system("cls");
printf("\n \n Escogiste la opcion de generar la
Expancsion de llaves");
printf("\n Por favor ingresa el nombre del
archivo donde se encuentra la llave de 128 bits con la extension .txt:
");
scanf("%s",key);
ExpansionKeys(key);
printf("\n \n Quieres regresar al menu
SI(1)/NO(2)?: ");
scanf("%d",&g);
break;
case 6:
system("cls");
printf("\n \n Hasta luego!");
return 0;
break;
default:
system("cls");
printf("\n Opcion invalida!");
printf("\n \n Quieres regresar al menu
SI(1)/NO(2)?: ");
scanf("%d",&g);
break;
}
}
printf("Hasta luego!");
return 0;
}