Pues tengo un problema :\
Si hago
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:
unsigned char *MD5(const unsigned char *d, unsigned long n,
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)
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
#include <iostream>
#include <openssl/md5.h>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
const unsigned char* cad1 = (unsigned char*)"Ejemplo";
unsigned char* cad2 = (unsigned char*)malloc(sizeof(char)*256);
cad2 = MD5(cad1, strlen((char*)cad1)*sizeof(char), NULL);
cout<<cad1<<endl<<cad2<<endl;
cout<<"Presiona una tecla para continuar...";
getchar();
return 0;
}
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
#include <openssl/md5.h>
#include <stdio.h>
#include <string.h>
// code testing by p0fk!
int main(int argc, char *argv[]){
unsigned char* hash;
int i;
printf("Frase : %s\n", argv
[1]); hash
= MD5
(argv
[1], strlen(argv
[1]), NULL
);
for (i
= 0;i
< strlen(hash
);i
++){ }
return 0;
}
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