Saltar al contenido
Underc0de /foro

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.

Avatar de Frijolito
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 Los enlaces son solo para miembros. Registrate o iniciá sesión aunque da el resultado en base64 lo paso a hex con esta pagina Los enlaces son solo para miembros. Registrate o iniciá sesión, y el resultado de mi programa no es el mismo que el de la pagina, adjunto fotos:

Problema con cifrado aes 128

Problema con cifrado aes 128

Problema con cifrado aes 128


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. Registrate o iniciá sesión

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];
}
WhatsApp Telegram

3 respuestas

Avatar de DtxdF
@Frijolito

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

Avatar de Frijolito
Cita de: DtxdF en Mayo 06, 2019, 03:23:14 PM
@Frijolito

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

Avatar de DtxdF
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 "Los enlaces son solo para miembros. Registrate o iniciá sesión"
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

🔗 Temas relacionados

¿Te quedó una duda sobre Dudas y pedidos generales?

Preguntala y te responde la comunidad (y el asistente Underc0de IA si nadie llega antes). Es gratis y tarda un minuto.

Ya tengo cuenta
Guardamos tu pregunta en este navegador: después de entrar la publicás con un clic.
Grupo de WhatsApp