Está en la página 1de 11

INSTITUTO POLITECNICO NACIONAL

ESCUELA SUPERIOR DE CMPUTO

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

Operaciones en las rodas del AES


1.
2.
3.
4.

SubBytes
ShiftRows
MixColumns
AddRoundKey

Para la Ronda inicial


La ronda inicial aplica solamente la operacin AddRoundKey que es aplicar una
operacin XOR byte a byte entre el bloque a cifrar y la clave inicial.

Para las rondas siguientes 9 rondas.


SubBytes: Cada byte del estado se reemplaza por otro valor de acuerdo a la tabla
de sustitucin de bytes S-Box ya vista en el clculo de las subclaves.
ShiftRows: En cada fila del estado, a excepcin de la primera, se rotan
circularmente hacia la izquierda los bytes, en la segunda fila se rotan una posicin,
en la tercera dos posiciones y en la cuarta tres posiciones.
MixColumns: A cada columna del estado se le aplica una transformacin lineal,
esto es multiplicarlo por una matriz predeterminada en el campo GF.
AddRoundKey: Se aplica la misma operacin que en la ronda inicial pero
utilizando otra subclave.

Para la ronda final


SubBytes: Se aplica igual que en las rondas anteriores.
ShiftRows: Se aplica igual que en las rondas anteriores.
AddRoundKey: Se aplica igual que en las rondas anteriores e inicial, pero
aplicando la ltima subclave.

Calcular la caja s
1.- Comenzar la s-box
00
10
20
30
.
.
.
.
.
F0

01

02

03

.................................................................... 0F

F1

F2

F3

...........................................................................FF

2.- Calcular el inverso de cada elemento del la s-box, excepto el 00


q(x) * x mod m(x) = 1

3.- Multiplicar cada polinomio de la caja- s por


x^4 + x^3 + x^2 + x + 1 mod x^2 + 1

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

1.- Rotacion de la ltima columna


00

63

FF

->

40

16

23

00 = 16

FF

16

00

16

00

63

00

63

Segunda columna de la subllave 8

Tercera columna de la subllave 8

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

Subllave para la ronda 8

23
16
16
63

23
16
E9
9C

23 23
16 16
16 E9
63 9C

Cdigo Fuente (SubBytes.h)


//
Autores: Sauls Corts Jhonatan
//
Aguirre Cruz Eder Jonathan
//
Grupo: 3CM2
//
05/11/15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Menu();
int ChecaBit(int x, int i);
int MultOperBits(int x, int n);
int gradoPolinomio(int n);
int sumaPolinomios(int pA,int pB);
int multiplicaPolinomios(int a,int b, int Pirreducible);
int multiplica(int aux,int polRecorrido,int gradoIrr);
unsigned extract(unsigned x, int p, int n);
unsigned invert(unsigned x, int p, int n);
void swap(int *a ,int *b);
int InversoPolinomio(int a, int m);
char *RepresentaPolinomio(int p);
void GeneraInversos(int n, int m);
void GeneraAES_Sbox();
int concat(int a, int b);
void ExpansionKeys(char key[20]);

Cdigo Fuente (SubBytes.c)


//
Autores: Sauls Corts Jhonatan
//
Aguirre Cruz Eder Jonathan
//
Grupo: 3CM2
//
05/11/15
#include "subbytes.h"
void Menu(){
printf("\n
printf("\n
printf("\n
printf("\n
printf("\n
printf("\n
printf("\n
printf("\n
}

SUBBYTES and Key Expansion");


1.- Inverso multiplicativo de un polinomio." );
2.- Representacion de un polinomio" );
3.- Inversos mutplicativos de GF(2^n)" );
4.- Generar AES-S box");
5.- Generar la expancion de llaves" );
6.- Salir");
Escoge la opcion que desees: ");

int MultOperBits(int x, int n){


return x<<n;
}
unsigned extract(unsigned x, int p, int n){
return ((x >> (p)) & ~(~0 << n));
}

unsigned invert(unsigned x, int p, int n){


return (((~(~0 << p + n) & (~0 << p)) & ~x) | ((( ~0 << p+n) | ~(~0
<<p)) & x) );
}
int ChecaBit(int x, int i){
int n = MultOperBits(1,i);
if((x&n) == n ){
return 1;
}
return 0;
}
int gradoPolinomio(int n){
int i =0 ;
while(n!=0){
n=n/2;
i++;
}
return i-1;
}
int sumaPolinomios(int pA,int pB){
int pRes;
pRes = pA^pB;
return pRes;
}
int multiplicaPolinomios(int a,int b, int Pirreducible){
int gradoA = gradoPolinomio(a);
int gradoIrr=gradoPolinomio(Pirreducible);
int polRecorrido= extract(Pirreducible,0,gradoIrr);
int c=0;
if( ChecaBit(a,0) == 1){
c=b;
}
int i =1;int aux = b ;
while(i <=gradoA){
aux = multiplica(aux,polRecorrido,gradoIrr);
if( ChecaBit(a,i) == 1 ){
c = sumaPolinomios(c,aux);
}
i++;
}
return c;
}
int multiplica(int aux,int polRecorrido,int gradoIrr){
int gradoaux= gradoPolinomio(aux)+1;
int producto=extract(MultOperBits(aux,1) , 0 , gradoIrr);
if( (gradoaux)>=gradoIrr ){

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

Cdigo Fuente (AppSubBytes.c)


//
Autores: Sauls Corts Jhonatan
//
Aguirre Cruz Eder Jonathan
//
Grupo: 3CM2
//
05/11/15
#include "subbytes.h"
#include <stdio.h>
int main(){
int opc,g=1,n,re,p,m;
char *pol,*res,key[20]={};
FILE *archivo;
while(g==1){
system("cls");
Menu();
scanf("%d",&opc);
switch(opc){
case 1:
system("cls");
printf("\n \n \n Escogiste la opcion de
encontrar el inverso multiplicativo de un polinomio!");
printf("\nIntroduce el polinomio irreducible:
");
scanf("%d",&m);
printf("\nIntroduce el polinomio en GF(2^n): " );
scanf("%d",&p);
pol=RepresentaPolinomio(p);
printf("\n El inverso del polinomio %s",pol);
re=InversoPolinomio(p,m);
res=RepresentaPolinomio(re);
printf("es= %s ",res);
printf("\n \n Quieres regresar al menu
SI(1)/NO(2)?: ");
scanf("%d",&g);
break;
case 2:
system("cls");
printf("\n \n \n Escogiste la opcion de
imprimir la representacion de un polinomio" );
printf("\n Introduce el polinomio en entero
porfavor: ");
scanf("%d",&p);
pol=RepresentaPolinomio(p);
printf("%s",pol);
printf("\n \n Quieres regresar al menu
SI(1)/NO(2)?: ");
scanf("%d",&g);
break;
case 3:
system("cls");
printf("\n \n \n Escogiste la opcion de
generar los inveros multiplicativos de un campo!" );
printf("\n Introduce el grado (n) del campo

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

También podría gustarte