Buenos dias, tengo un problema muy simple estoy haciendo un programa que cifre un texto de 16 bytes con aes pero al probrar si el texto de salida es el mismo que en esta pagina Los enlaces son solo para miembros.
aunque da el resultado en base64 lo paso a hex con esta pagina Los enlaces son solo para miembros.
, y el resultado de mi programa no es el mismo que el de la pagina, adjunto fotos:
El codigo es bantante extenso pero esta comentado y les dejare el pdf que estoy siguiendo para hacer el codigo: Los enlaces son solo para miembros.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void ExpandirClave( unsigned char Clave[4][4], unsigned char ClaveExpandida[4][44] );
void Encriptar( unsigned char Texto[4][4] , unsigned char Claves[4][44] );
// Pasos para encriptar
void MixColums( unsigned char Texto[4][4] );
void SubBytes( unsigned char Texto[4][4] );
void ShiftRows( unsigned char Texto[4][4] );
void AddRoundKey( unsigned char Clave[4][4], unsigned char Texto[4][4] );
int S_Box( int Post ); // S_BOX No se que wea es pero se tiene que usar
int RCON[11] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c};
int main(){
printf("\n\t\t\t\t\t\t Cifrado AES " );
printf("\n\t\t\t\t\t\tBy: Frijolito" );
printf("\n");
// Se usa el unsigned para que tome valores de [0 - 255]
unsigned char Texto[16] = {'A','r','e','_','Y','o','u','_','a','_','1','_','o','r','_','0'};
unsigned char Matriz_Texto[4][4];
unsigned char Clave[16] = {'I','m','T','h','e','O','n','e','W','h','o','K','n','o','c','k'};
unsigned char Matriz_Clave[4][4];
unsigned char SubsClaves[4][44]; // Se almacenan todas las subclaves aca
printf("\n\t [>>] Texto: ");
for( int i=0 ; i<16 ; i++ ){
printf("0x%2x ", Texto[i] );
}
printf("\n\t [>>] Clave: ");
for( int i=0 ; i<16 ; i++ ){
printf("0x%2x ", Clave[i] );
}
printf("\n");
for( int i=0 ; i<4 ; i++ ){ // Se pasa el texto a una matriz
for( int j=0 ; j<4 ; j++ ){
Matriz_Texto[j][i] = Texto[i*4 +j];
}
}
for( int i=0 ; i<4 ; i++ ){ // Se pasa la clave a una matriz
for( int j=0 ; j<4 ; j++ ){
Matriz_Clave[j][i] = Clave[i*4 +j];
}
}
ExpandirClave( Matriz_Clave, SubsClaves );
Encriptar( Matriz_Texto, SubsClaves );
printf("\t [>>] Texto cifrado hex: ");
for( int i=0 ; i<4 ; i++ ){
for( int j=0 ; j<4 ; j++ ){
printf("0x%2x ", Matriz_Texto[i][j] );
}
}
printf("\n\t [>>] Texto cifrado dec: ");
for( int i=0 ; i<4 ; i++ ){
for( int j=0 ; j<4 ; j++ ){
printf("%c ", Matriz_Texto[i][j] );
}
}
printf("\n");
return 0;
}
void ExpandirClave( unsigned char Clave[4][4], unsigned char ClaveExpandida[4][44] ){
printf("\n\t [!!] Generando SubsClaves.");
unsigned char CopiaColumna[4];
char Aux;
for( int i=0 ; i<4 ; i++ ){
for( int j=0 ; j<4 ; j++ ){
ClaveExpandida[i][j] = Clave[i][j];
}
}
for( int i=4 ; i<44 ; i++ ){
for( int j=0 ; j<4 ; j++ ){
CopiaColumna[j] = Clave[j][i-1];
}
if( i%4 == 0 ){
Aux = CopiaColumna[0]; // Se aplica RotWord de 1 byte
CopiaColumna[0] = CopiaColumna[1];
CopiaColumna[1] = CopiaColumna[2];
CopiaColumna[2] = CopiaColumna[3];
CopiaColumna[3] = Aux;
for( int j=0 ; j<4 ; j++ ){
CopiaColumna[j] = S_Box(CopiaColumna[j]);
}
CopiaColumna[0] = CopiaColumna[0] ^ RCON[i/4];
}
for( int j=0 ; j<4 ; j++ ){
ClaveExpandida[j][i] = ClaveExpandida[j][i-4] ^ CopiaColumna[j];
}
}
printf("\n\t [!!] SubsClaves generadas.\n");
}
void Encriptar( unsigned char Texto[4][4], unsigned char Claves[4][44] ){
printf("\n\t [!!] Encriptando.\n");
unsigned char SubsClaves[4][4];
int x = 4;
// Ronda Inicial
printf("\n\t [>>] Ronda inicial ");
for( int i=0 ; i<4 ; i++ ){
for( int j=0 ; j<4 ; j++ ){
SubsClaves[i][j] = Claves[i][j];
}
}
AddRoundKey( SubsClaves, Texto );
printf("Lista.");
// Ronda Media
printf("\n\t [>>] Ronda media ");
for( int i=0 ; i<=9 ; i++ ){
SubBytes( Texto );
ShiftRows( Texto );
MixColums( Texto );
for( int j=0 ; j<4 ; j++ ){
for( int h=x ; h<x+4 ; h++ ){
SubsClaves[j][h-x] = Claves[j][h];
}
}
x = x + 4;
AddRoundKey( SubsClaves, Texto );
}
printf("Listo.");
// Ronda Final
printf("\n\t [>>] Ronda final ");
SubBytes( Texto );
ShiftRows( Texto );
for( int i=0 ; i<4 ; i++ ){
for( int j=40 ; j<44 ; j++ ){
SubsClaves[i][j-40] = Claves[i][j];
}
}
AddRoundKey( SubsClaves, Texto );
printf("Listo.\n\n");
}
void AddRoundKey( unsigned char Clave[4][4], unsigned char Texto[4][4] ){
for( int i=0 ; i<4 ; i++ ){
for( int j=0 ; j<4 ; j++ ){
Texto[i][j] = Texto[i][j] ^ Clave[i][j];
}
}
}
void SubBytes( unsigned char Texto[4][4] ){
for( int i=0 ; i<4 ; i++ ){
for( int j=0 ; j<4 ; j++ ){
Texto[i][j] = S_Box( Texto[i][j] );
}
}
}
void ShiftRows( unsigned char Texto[4][4] ){
unsigned char ClaveAux;
int k = 1;
for( int i=1 ; i<4 ; i++ ){
for( int h=0 ; h<k ; h++){
ClaveAux = Texto[i][0];
for( int j=0 ; j<4 ; j++ ){
Texto[i][j] = Texto[i][j+1];
}
Texto[i][3] = ClaveAux;
}
k = k + 1;
}
}
void MixColums( unsigned char r[4][4] ){
unsigned char a[4];
unsigned char b[4];
unsigned char h;
/* The array 'a' is simply a copy of the input array 'r'
* The array 'b' is each element of the array 'a' multiplied by 2
* in Rijndael's Galois field
* a[n] ^ b[n] is element n multiplied by 3 in Rijndael's Galois field */
for ( int i=0 ; i<4 ; i++ ) {
for( int j=0 ; j<4 ; j++ ){
a[i] = r[j][i];
// h is 0xff if the high bit of r[c] is set, 0 otherwise
h = (unsigned char)((signed char)r[j][i] >> 7); // arithmetic right shift, thus shifting in either zeros or ones
b[i] = r[j][i] << 1; // implicitly removes high bit because b[c] is an 8-bit char, so we xor by 0x1b and not 0x11b in the next line
b[i] ^= 0x1B & h; // Rijndael's Galois field
}
r[0][i] = b[0] ^ a[3] ^ a[2] ^ b[1] ^ a[1]; /* 2 * a0 + a3 + a2 + 3 * a1 */
r[1][i] = b[1] ^ a[0] ^ a[3] ^ b[2] ^ a[2]; /* 2 * a1 + a0 + a3 + 3 * a2 */
r[2][i] = b[2] ^ a[1] ^ a[0] ^ b[3] ^ a[3]; /* 2 * a2 + a1 + a0 + 3 * a3 */
r[3][i] = b[3] ^ a[2] ^ a[1] ^ b[0] ^ a[0]; /* 2 * a3 + a2 + a1 + 3 * a0 */
}
}
int S_Box( int Post ){ // S_BOX No se que wea es pero se tiene que usar
int s_box[256] = {
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
return s_box[Post];
}