elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Duda]Obtener hash MD5 con C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Duda]Obtener hash MD5 con C++  (Leído 8,959 veces)
final_frontier
Wiki

Desconectado Desconectado

Mensajes: 583


WOLOLOOO! Deal with it x)


Ver Perfil
[Duda]Obtener hash MD5 con C++
« en: 3 Septiembre 2010, 06:16 am »

Buenas, investigando investigando encontré una supuesta librería con la que podría obtener el MD5 de una cadena de texto (sigo sin distinguir bien si esto va aquí o en criptografía >_>) y estoy usando la función md5 de openssl:

Código
  1. #include <iostream>
  2. #include <openssl/md5.h>
  3. #include <cstdlib>
  4. #include <cstdio>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.  
  11.    unsigned char* cad1;
  12.    unsigned char* cad2 = (unsigned char*)malloc(sizeof(char)*256);
  13.  
  14.    cad1 = (unsigned char*)"ejemplo";
  15.  
  16.    cad2 = MD5(cad1, sizeof(cad1), cad2);
  17.  
  18.    cout<<cad1<<endl<<cad2<<endl;
  19.    cout<<"Presiona una tecla para continuar...";
  20.    getchar();
  21.    return 0;
  22. }

Y el resultado que da por consola es este:

Código:
ejemplo
"�\�<��8D?��o
Presiona una tecla para continuar...

Me he leído la doc que hay en man 3 md5 pero no encuentro el problema  :huh:
Alguna ayuda?

Un saludo


En línea

Sie ist der hellste Stern von allen und wird nie vom Himmel fallen...
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [Duda]Obtener hash MD5 con C++
« Respuesta #1 en: 3 Septiembre 2010, 07:33 am »

En estos momentos no tengo la implementación de openssl como para probar, pero viendo el código, se ven dos errores:

Código
  1. cad1 = (unsigned char*)"ejemplo";

Las cadenas literales son constantes, por tanto, el puntero debería tener el calificador const. Ademas, generalmente las cadenas literales se encuentran en una sección de solo lectura.

En casos como estos, lo ideal es:

Código
  1. const unsigned char* cad1="Ejemplo";

lo cual implica que cualquier intento de asignación posterior devuelve un error.

O bien, inicializar un arreglo:

Código
  1. unsigned char cad1[]="Ejemplo";

El segundo error:

Código
  1. cad2 = MD5(cad1, sizeof(cad1), cad2);

cad1 es un puntero, sizeof(cad1) devolverá 4 bytes (tamaño del puntero) y sizeof(*cad1) devolverá el tamaño del primer elemento de la cadena, es decir 1 byte, lo cual es incorrecto debido al objetivo de ese parámetro.

Saludos!


En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
final_frontier
Wiki

Desconectado Desconectado

Mensajes: 583


WOLOLOOO! Deal with it x)


Ver Perfil
Re: [Duda]Obtener hash MD5 con C++
« Respuesta #2 en: 3 Septiembre 2010, 08:02 am »

Pues tengo un problema :\

Si hago
Código
  1. const unsigned char* cad1="Ejemplo";
me tira este error:
main.cpp:11: error: invalid conversion from ‘const char*’ to ‘const unsigned char*’

Y el primer argumento de la función MD5 me da un error si subsano el error anterior con un casting:
main.cpp:16: error: invalid conversion from ‘const unsigned char*’ to ‘const char*’
main.cpp:16: error:   initializing argument 1 of ‘size_t strlen(const char*)’

Si hago otro casting para evadir eso me sigue tirando basura

Prototipo de la función MD5:
Código
  1. unsigned char *MD5(const unsigned char *d, unsigned long n,
  2.                         unsigned char *md);

Según man:

MD2(), MD4(), and MD5() compute the MD2, MD4, and MD5 message digest of the n bytes at d and place it in md (which must have space for MD2_DIGEST_LENGTH == MD4_DIGEST_LENGTH == MD5_DIGEST_LENGTH == 16 bytes of output). If md is NULL, the digest is placed in a static array.

Así que en el 3º parámetro se puede poner NULL y la cadena la devuelve, así que lo hice habiendo hecho castings para que dejara de tirarme errores (pero la variable por fuerza ya no es del tipo que debiera)

Código
  1. cad2 = MD5(cad1, strlen((char*)cad1)*sizeof(char), NULL);

En esta parte ya empiezo a perder los nervios...

por la explicación que diste, calculé el tamaño de la cadena y lo multipliqué por lo que ocupa un char un memoria, ya que: MD5 message digest of the n bytes at d and place it in md

Código
  1. #include <iostream>
  2. #include <openssl/md5.h>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11.    const unsigned char* cad1 = (unsigned char*)"Ejemplo";
  12.    unsigned char* cad2 = (unsigned char*)malloc(sizeof(char)*256);
  13.  
  14.    cad2 = MD5(cad1, strlen((char*)cad1)*sizeof(char), NULL);
  15.    cout<<cad1<<endl<<cad2<<endl;
  16.    cout<<"Presiona una tecla para continuar...";
  17.    getchar();
  18.    return 0;
  19. }

Ejecuto el code, y sigue igual D:
y si dejo esas partes como me dijiste me tira error el compilador, el caso es que tengo un code en C casi igual

Código
  1. #include <openssl/md5.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. // code testing by p0fk!
  5.  
  6. int main(int argc, char *argv[]){
  7.  
  8.        unsigned char* hash;
  9.        int i;
  10.        printf("Frase : %s\n", argv[1]);
  11.        hash = MD5(argv[1], strlen(argv[1]), NULL);
  12.  
  13.        for (i = 0;i < strlen(hash);i++){
  14.        printf("%x",hash[i]);
  15.        }
  16.  
  17. printf("\n");
  18. return 0;
  19.  
  20. }

Y aquí es ya cuando perdí los nervios del todo:

1.- Porqué si paso el code de C a C++ me da error con los parámetros de las funciones cuando lo dejo EXACTAMENTE IGUAL?

2.- Porqué C++ es así de ca**** con los tipos de las variables y C no?

3- Cómo voy a hacer bien el code si me obliga el compilador a usar castings por todas partes?

Un saludo

Para la pregunta 1 tengo una prueba:

finalfrontier@rabidalap:~/Downloads$ gcc main.c -lssl -lcrypto -o main
finalfrontier@rabidalap:~/Downloads$ g++ main.cpp -lssl -lcrypto -o main
main.cpp: In function ‘int main(int, char**)’:
main.cpp:12: error: invalid conversion from ‘char*’ to ‘const unsigned char*’
main.cpp:12: error:   initializing argument 1 of ‘unsigned char* MD5(const unsigned char*, size_t, unsigned char*)’
main.cpp:14: error: invalid conversion from ‘unsigned char*’ to ‘const char*’
main.cpp:14: error:   initializing argument 1 of ‘size_t strlen(const char*)’
finalfrontier@rabidalap:~/Downloads$

Versión de gcc creo que la 4.4, Debian Squeeze 2.6.32-5-686
« Última modificación: 3 Septiembre 2010, 08:07 am por final_frontier » En línea

Sie ist der hellste Stern von allen und wird nie vom Himmel fallen...
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [Duda]Obtener hash MD5 con C++
« Respuesta #3 en: 3 Septiembre 2010, 09:21 am »

 ;D, vamos por partes:

Primero que nada, si no solucionas los errores en un código en determinado lenguaje, no lo intentes con otro solo por probar. C++ y C comparten muchas cosas pero también difieren en otras, por tanto en gran parte de los casos lo único que vas a obtener es dolores de cabeza extras.


Citar
Y el primer argumento de la función MD5 me da un error si subsano el error anterior con un casting:
main.cpp:16: error: invalid conversion from ‘const unsigned char*’ to ‘const char*’
main.cpp:16: error:   initializing argument 1 of ‘size_t strlen(const char*)’

Normal, es lo que debería suceder debido a que son distintos tipos a pesar que compartan el mismo tamaño y los mismos requerimientos de alineación.


Citar
   
Código
  1. const unsigned char* cad1 = (unsigned char*)"Ejemplo";
  2.    unsigned char* cad2 = (unsigned char*)malloc(sizeof(char)*256);
  3.  
  4.    cad2 = MD5(cad1, strlen((char*)cad1)*sizeof(char), NULL);

No es necesario el *sizeof, al menos que en algún punto planees utilizar unicode, pero en el código actual no es lo que ocurre. Un char es 1 byte.

Proba esto:

Código
  1.  
  2. unsigned char *hash=(unsigned char*)malloc(sizeof(char)*MD5_DIGEST_LENGTH);
  3. const unsigned char cad1[]="Ejemplo";
  4.  //Asegurarse que hash este terminada en NULL.
  5.  MD5(cad1, strlen(reinterpret_cast<const char*>(cad1)),hash);
  6.  //O podes hacer, en este caso, sizeof(cad1), ya que cad1 en este caso no es un puntero si no un array.
  7.  cout<<"Frase: "<<cad1<<endl<<"Hash: "<<hash<<endl;


Citar
Porqué si paso el code de C a C++ me da error con los parámetros de las funciones cuando lo dejo EXACTAMENTE IGUAL?

Habría que ver que tipos de errores, pero teniendo en cuenta que son dos lenguajes distintos no debería ser una sorpresa. Pasar de un lenguaje a otro sin mas como mínimo te garantiza algún que otro error.

Citar
2.- Porqué C++ es así de ca**** con los tipos de las variables y C no?

No debería? es porque C++ utiliza un chequeo de tipos mas estricto, que en gran parte de los casos es una ventaja y no al revés.

Citar
3- Cómo voy a hacer bien el code si me obliga el compilador a usar castings por todas partes?

El problema es que estas acostumbrado a utilizar old-style casting, común en C pero obsoleto en C++. De hecho C++ provee toda una nueva gama de operadores para dicha tarea.

C++ Casting operators

Saludos!
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
final_frontier
Wiki

Desconectado Desconectado

Mensajes: 583


WOLOLOOO! Deal with it x)


Ver Perfil
Re: [Duda]Obtener hash MD5 con C++
« Respuesta #4 en: 3 Septiembre 2010, 11:21 am »

Nada, sigue sin funcionar ni con el code que has puesto, pero no he entendido una cosa (aunque no creo que importe si no va..)

Código:
Asegurarse que hash este terminada en NULL.

 :huh: :huh:

Perdona mi ignorancia compañero, pero no se que quieres decir ahí
En línea

Sie ist der hellste Stern von allen und wird nie vom Himmel fallen...
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [Duda]Obtener hash MD5 con C++
« Respuesta #5 en: 3 Septiembre 2010, 11:33 am »

Lamentablemente mas no puedo hacer porque no tengo la implementación de openssl instalada, pero funcionar debería funcionar correctamente con el código que te puse al menos que dentro de la función haya errores de los cuales no estamos al tanto. En todo caso postea los errores así lo vemos.  :D

Citar
Perdona mi ignorancia compañero, pero no se que quieres decir ahí

Si, las cadenas al estilo C, deben finalizar con un carácter nulo . '\0', 0, etc. Como desconozco la tarea que realiza la función MD5, lo aclare por las dudas.

Si no sabes lo que es el carácter nulo, te recomendaría que le des un repaso al manejo de cadenas.

Saludos
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
final_frontier
Wiki

Desconectado Desconectado

Mensajes: 583


WOLOLOOO! Deal with it x)


Ver Perfil
Re: [Duda]Obtener hash MD5 con C++
« Respuesta #6 en: 4 Septiembre 2010, 01:52 am »

Ya entiendo, esque eso de la cadena terminada en NULL me quedé así como  :huh: :silbar:

El caso es que el code no tira error pero sigue sin funcionar  :(

Conoces en C/C++ alguna otra forma de obtener un md5??
He hecho de todo y parece no funcionar :(

Un saludo

Lh: Uniendo mensajes. Usa el botón modificar  ;D

Ya tengo la gracia del año :xD

La cadena no viene "digerida" del todo y cada carácter hay que representarlo como hexadecimal

Código
  1.        for (i = 0;i < strlen(hash);i++){
  2.        printf("%x",hash[i]);
  3.        }

Ahora lo que busco es guardarlo todo en una única cadena y ya está xD

Un saludo
« Última modificación: 4 Septiembre 2010, 07:19 am por Littlehorse » En línea

Sie ist der hellste Stern von allen und wird nie vom Himmel fallen...
Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: [Duda]Obtener hash MD5 con C++
« Respuesta #7 en: 4 Septiembre 2010, 07:31 am »

 :laugh: ;-)

Nunca se me hubiese ocurrido que ese era tu problema, porque en el código que pusiste en C, ya tenias hecha la parte donde imprimías los caracteres, y lo hacías precisamente de esa forma  ;D.
En C++ podes usar el manipulador hex o ::setf.

Saludos
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Karman


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Re: [Duda]Obtener hash MD5 con C++
« Respuesta #8 en: 9 Septiembre 2010, 03:45 am »

Código
  1. unsigned char *MD5String (int inlen,unsigned char *inString){
  2.  static unsigned char rBuf[1024];
  3.  unsigned char tBuf[512];int i;
  4.  MD5(inString,inlen,tBuf);
  5.  for(i=0;i<16;i++)
  6.    sprintf((char*)&rBuf[i*2],"%02x",tBuf[i]&0xFF);
  7.  return rBuf;
  8. }

S2
« Última modificación: 9 Septiembre 2010, 03:49 am por Karman » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Obtener el HASH del handshake WPA y descifrar con programas no habituales
Hacking Wireless
3ncr1pt3d 0 9,418 Último mensaje 8 Marzo 2011, 17:43 pm
por 3ncr1pt3d
A partir del hash y de la contraseña, obtener patrón? « 1 2 »
Criptografía
‭lipman 14 15,613 Último mensaje 5 Junio 2011, 03:26 am
por ‭lipman
Obtener el Hash de administrador
Hacking
Carpena 6 9,243 Último mensaje 19 Julio 2011, 13:56 pm
por darks_xtar
Duda con Hash de cookie de sesión.
Criptografía
HariSheldon 1 4,424 Último mensaje 20 Julio 2011, 14:43 pm
por APOKLIPTICO
Duda mensajes HASH
Criptografía
nomdeusuari 1 3,103 Último mensaje 24 Julio 2012, 15:57 pm
por APOKLIPTICO
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines