Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 2 Septiembre 2015, 02:24 am



Título: Error al en/descifrar string C++
Publicado por: Kaxperday en 2 Septiembre 2015, 02:24 am
Bueeeno, resulta que me resistía a crear este hilo, pero no me queda otro remedio tras horas de frustración.

Tengo una clase que saque del Rijandel a través de su code source de codeproyect.

Esa clase en mi proyecto se llama "encriptador_1". Y bien creo una clave de 24 caracteres, ahora tengo que cifrar en bloque pues venga que comience la fiesta.

Código
  1. encriptador_1 prueba;
  2. prueba.MakeKey(ENCLAVE_PRIMERA, encriptador_1::sm_chain0, 24, 24);
  3. string ***** = "wu1394yvh 1034y v180934ync89103y4 0813480ycn10384yn081n348401";
  4. char * salida = new char[*****.length()]();//length te da los bytes.
  5. cout << *****.length() << " " << strlen(*****.c_str()) << endl;
  6. while (*****.length() % 24 != 0)
  7. ***** += '\0';
  8.  
  9. cout << *****.length() << " " << strlen(*****.c_str()) << endl;
  10. prueba.Encrypt(*****.c_str(), salida, *****.length(), 0);
  11. cout << "entrada: " << ***** << endl;
  12. cout << "cifra: " << salida << endl;
  13. ***** = salida;
  14. strcpy(salida, "");
  15. while (*****.length() % 24 != 0)
  16. ***** += '\0';
  17. prueba.Decrypt(*****.c_str(), salida, *****.length(), 0);
  18. cout << "descifra: " << salida << endl;
  19. cout << "feliz";
  20. system("pause");

Salida:

Citar
61 61
72 61
entrada: wu1394yvh 1034y v180934ync89103y4 0813480ycn10384yn081n348401          
cifra: ÃÅäþ̵=C¾
descifra: 8╝
Ï┤─¸K{ç§░lI┐Ò┬ä%+2¨Ò▄┘f«ð¹º»½h
pUq@ôMä°BÛ¤§p1ê­¡┐e┐È╩µÒ¥Q▓UGø°±{!9¹L
felizPresione una tecla para continuar . . .

He de decir que me he dado cuenta que string.legth() devuelve caracteres incluyendo \0 en la string y strlen() solo hasta el primer \0.

Como se puede observar no cifra correctamente, antes lo hice funcionar pero me daba error en el system("pause"), omg. Algo casca por ahí.

Cojo una cadena la añados \0 hasta hacerla múltiplo, luego llamo a Riyandel.Encrypt(), y le paso un puntero char* del que he reservado memoria igual al tamaño de la cadena a cifrar, ese puntero tras llamada al método contiene la cadena cifrada.

Esa cadena la paso a la string y repito el proceso.

¿Qué hago mal?

Saludos.

Edito: Por favor basta de banear la palabra mierd.a es muy usada en la comunidad, de hecho es la palabra que se me banea en el código #FREEMIERDA.

Por cierto he reducido la cadena y he eliminado los espacios y me funciona (sale la cadena descifrada correctamente) pero el programa casca, al depurar dice que es el system("pause") pero creo que es algo de overflow.

Saludos.

EDICION DELICATESSE: solucionado rigth now, habia un overflow en el puntero, necesitaba mas memoria pues la cadena desenciptada tenía mas caracteres de los que podia abarcar el puntero.

Código
  1. encriptador_1 prueba;
  2. prueba.MakeKey(ENCLAVE_PRIMERA, encriptador_1::sm_chain0, 24, 24);
  3. string ***** = "wu1394yvh1034y v180934ync89103y0 813480ycn10qwefq  384yn081n348401";
  4.  
  5. cout << *****.length() << " " << strlen(*****.c_str()) << endl;
  6. while (*****.length() % 24 != 0)
  7. ***** += '\0';
  8. char * salida = new char[*****.length()]();//length te da los bytes.
  9. cout << *****.length() << " " << strlen(*****.c_str()) << endl;
  10. prueba.Encrypt(*****.c_str(), salida, *****.length(), 0);
  11. cout << "entrada: " << ***** << endl;
  12. cout << "cifra: " << salida << endl;
  13. ***** = salida;
  14. strcpy(salida, "");
  15. cout << *****.length() << endl;
  16. while (*****.length() % 24 != 0)
  17. ***** += '\0';
  18. salida = new char[*****.length()]();
  19. prueba.Decrypt(*****.c_str(), salida, *****.length(), 0);
  20. cout << "descifra: " << salida << endl;
  21. cout << "feliz";
  22. system("pause");

Working fine muak mk, Kaxperday