Problema con cifrado aes 128

  • 3 Respuestas
  • 1242 Vistas

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

Desconectado Frijolito

  • *
  • Underc0der
  • Mensajes: 81
  • Actividad:
    0%
  • Actividad:
    0%
  • Reputación 1
    • Ver Perfil

Problema con cifrado aes 128

  • en: Mayo 05, 2019, 06:48:13 pm
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 https://aesencryption.net/ aunque da el resultado en base64 lo paso a hex con esta pagina https://conv.darkbyte.ru/, 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: http://sedici.unlp.edu.ar/bitstream/handle/10915/4210/Documento_completo.pdf?sequence=1&isAllowed=y

Código: (c) [Seleccionar]
#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];
}
« Última modificación: Mayo 05, 2019, 07:19:54 pm por Frijolito »

Conectado DtxdF

  • *
  • Moderator
  • Mensajes: 863
  • Actividad:
    100%
  • Actividad:
    100%
  • Country: 00
  • Reputación 17
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

Re:Problema con cifrado aes 128

  • 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.
Los seres humanos son robots, cuyo combustible es el afanado dinero.

Desconectado Frijolito

  • *
  • Underc0der
  • Mensajes: 81
  • Actividad:
    0%
  • Actividad:
    0%
  • Reputación 1
    • Ver Perfil

Re:Problema con cifrado aes 128

  • en: Mayo 06, 2019, 07:43:59 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

Conectado DtxdF

  • *
  • Moderator
  • Mensajes: 863
  • Actividad:
    100%
  • Actividad:
    100%
  • Country: 00
  • Reputación 17
  • Eres un auto y tienes dos opciones: Parar o Seguir
    • Ver Perfil
    • Mi repositorio de Github donde encontraras herramientas para tu trabajo.
    • Email

Re:Problema con cifrado aes 128

  • en: Mayo 06, 2019, 11:40:03 pm
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 "https://es.wikipedia.org/wiki/Vector_de_inicialización"
Los seres humanos son robots, cuyo combustible es el afanado dinero.