Como pasar una cadena char a hexadecimal por argumento a un constant char?

Iniciado por ahaugas, 12 Enero 2013, 13:00 PM

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

ahaugas

hola queria saber o si me pueden orientar a pasar una cadena char que obtengo desde un argumento a una cadena constant char en forma hexadecimal.

de c++ se bastante poco

lo que obtengo mediante un argumento

unsigned char mensaje[32];
strncpy((char *) mensaje, argv[2], 32);


el constant char esta definido con una clave por defecto pero me gustaria sustituirlo por uno dinamico al obtener por el argumento citado arriba.


unsigned char aesKey[32] = {
0x53, 0x28, 0x40, 0x6e, 0x2f, 0x64, 0x63, 0x5d, 0x2d, 0x61, 0x77, 0x40, 0x76, 0x71, 0x77, 0x28,
0x74, 0x61, 0x7d, 0x66, 0x61, 0x73, 0x3b, 0x5d, 0x66, 0x6d, 0x3c, 0x3f, 0x7b, 0x66, 0x72, 0x36
};


la idea es obtener:

unsigned char mensaje[32];
strncpy((char *) mensaje, argv[2], 32);

unsigned char aesKey[32] = mensaje (hexadecimal);


gracias
si tienen alguna duda o correccion porfavor pregunten o hagan alguna sugerencia
no subestimar al mas debil ya que tendra otras experiencias

avesudra

No entiendo a que te refieres con una cadena constant char en forma hexadecimal. Quieres introducir esto:
0x53 0x54 0x55 ...
¿Y que el programa lo guarde en aesKey? O quieres introducir esto:
ahagjh89875
Y que el programa lo guarde en aesKey.

Una vez dicho eso para hacer lo último solo con hacer esto:
#include<stdio.h>
unsigned char aesKey[32] = {
0x53, 0x28, 0x40, 0x6e, 0x2f, 0x64, 0x63, 0x5d, 0x2d, 0x61, 0x77, 0x40, 0x76, 0x71, 0x77, 0x28,
0x74, 0x61, 0x7d, 0x66, 0x61, 0x73, 0x3b, 0x5d, 0x66, 0x6d, 0x3c, 0x3f, 0x7b, 0x66, 0x72, 0x36
};
int main (int argc, char*argv[])
{
 //Aqui se copia todo lo que hay en argv[1] a aesKey
 memcpy(aesKey,argv[1],32);
 //Esto puedes obviarlo , es solo para mostrarlo por pantalla en formato hexadecimal.
 for(register int i = 0; i!=32;++i)
 {
     printf("0x%X ",aesKey[i]);
 }
 getchar();
 return 0;
}

Con este último código yo que tu tendría cuidado pues solo copia los carácteres que hay, pero si dejas esa por defecto, te va a sustituir los 4 o 5(el largo de lo que introduzcas) primeros pero no los demás hasta llegar hasta 32. Así que mi consejo es que si hay parámetros hagas esto pero antes inicialices a 0 todos los elementos de aesKey con un for o un while.
¡Un saludo!

PD: Perdon si no es lo que quieres  :-\
Regístrate en

ahaugas

bueno lo que quiero es que me lea la clave desde donde esta aesKey, en forma hexadecimal o en normal da igual. (la idea era hacerlo igual)

en forma estatica me lee la clave bien tanto para cifrar como descifrar, pero si lo pongo con un argumento para que sea dinamica al cifrar me lo cifra pero no descifra bien.

esto es lo que tengo, es mas o menos la instruccion mas completa no voy a poner todo por que ocupa como unas tres paginas y creo que con esto es suficiente.

segun las modificaciones que he hecho funciona a medias con tu ayuda, pero muchas gracias por tu esfuerzo.


//*********** Check the arguments ************
if (argv[2] == NULL)
{
help();
return 0;
}
//******************************************************
puts("Desecriptando...");


//****************** AES decryption ********************
unsigned char aesKey[32];    // <----------------------|
//        |
//Aqui se copia todo lo que hay en argv[2] a aesKey ---|
memcpy(aesKey,argv[2],32);

unsigned char *buf;

aes256_context ctx;
aes256_init(&ctx, aesKey);

for (unsigned long i = 0; i < lSize/16; i++) {
buf = text + (i * 16);
aes256_decrypt_ecb(&ctx, buf);
}

aes256_done(&ctx);
//******************************************************



no sale del todo bien, y no se donde puede estar el fallo, si fuera php ya lo tendria resuelto.
no subestimar al mas debil ya que tendra otras experiencias

ahaugas

bueno una parte ya esta solucionado, solo tengo que corregir un pequeño problemilla que me queda:

la encriptacion y desencriptacion funciona correctamente al pasar los argumentos, sin embargo solo lee las 2 primeras caracteres introducidas.

que puede estar fallando?
utilizo el argv[2], que es el argumento con el que opero la contraseña

Citar
   const int size = 32;
   unsigned char aesKey[size];
   char* p;

   for (int i = 1; i < argc || i < size; ++i)
   {
      aesKey = (unsigned char)strtol(argv[2], &p, 16);
   }

gracias
no subestimar al mas debil ya que tendra otras experiencias