Problema con cifrado aes 128

Iniciado por Frijolito, Mayo 05, 2019, 06:48:13 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Mayo 05, 2019, 06:48:13 PM Ultima modificación: Mayo 05, 2019, 07:19:54 PM por Frijolito
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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta aunque da el resultado en base64 lo paso a hex con esta pagina No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, 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: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Código: c
#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];
}

@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Hay dos probabilidades y una tres (debido a que no puedo apoyarte con el código debido a los pocos conocimientos en el lenguaje que usaste, aunque si eh usado, sigo y seguiré usando el cifrado AES en python).

La primera posibilidad es que no estás aplicando las mismas funciones que en la página web.

La segunda y la mas probable son los vectores de inicialización, que probablemente genera tu programa produciendo una salida diferente a pesar de que la entrada es la misma.

Lo que me pude llegar a dar cuenta es que en la página donde se cifran los datos usan los mismo vectores de inicialización, cada vez que pinchi el botón "encrypt" obtengo una salida sin cambios, algo posiblemente irrelevante.
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Hay dos probabilidades y una tres (debido a que no puedo apoyarte con el código debido a los pocos conocimientos en el lenguaje que usaste, aunque si eh usado, sigo y seguiré usando el cifrado AES en python).

La primera posibilidad es que no estás aplicando las mismas funciones que en la página web.

La segunda y la mas probable son los vectores de inicialización, que probablemente genera tu programa produciendo una salida diferente a pesar de que la entrada es la misma.

Lo que me pude llegar a dar cuenta es que en la página donde se cifran los datos usan los mismo vectores de inicialización, cada vez que pinchi el botón "encrypt" obtengo una salida sin cambios, algo posiblemente irrelevante.

que te refieres con lo de los vectores de inicalizacion? no entendi esa parte

Los vectores de inicialización (En inglés "Incialization vectors", mayormente conocidos por su abreviatura "IV"), es un conjunto de bits, para hacer más ilegible a posibles patrones de texto plano comunes, que hacen posible el descubrimiento de el contenido que se cifra.

Puedes encontrar una respuesta mas precisa y detallada en "No tienes permitido ver los links. Registrarse o Entrar a mi cuenta"
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF