Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 28 Octubre 2015, 18:44 pm



Título: Error sobre cifrado AES
Publicado por: Kaxperday en 28 Octubre 2015, 18:44 pm
Buenas, reestructuraré la pregunta:

Utilizo un archivo donde guardo datos, esos datos me interesa que estén cifrados, para ello siempre que escribo algo en el (un grupo de datos) lo cifro antes de escribirlo en él.

Cuando escribo datos paso un tuple<u_char*,int> "bytes", pues AES necesita el tamaño para cifrarlo, lo escribe en el archivo y al final siempre deja un "\0", a veces cuando va a escribir por segunda vez (sobre lo escrito anteriormente) salta un error en ejecución, sobre la línea del ofstream.write : "se produjeron daños en un montón".

Código:

Código
  1. void almacen::escribir_cifrado(bytes _datos)
  2. {
  3. ofstream archivo;
  4. archivo.open(directorio, ofstream::app | ofstream::binary);
  5. _datos = cifrador.encriptar_AES(get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
  6. -> archivo.write((char*)&(get<CONTENIDO>(_datos)[0]), get<TAMAÑO>(_datos));
  7. archivo.close();
  8. }


Aparte al descifrarlo, leo todo el archivo en binario, y lo mando descifrar, pero solo descifra el primer bloque de datos, he mostrado todos los bytes como ints y me cortaba en el primer '\0', he probado a suprimirlos y persiste el problema, ¿que puede ser? ¿dónde está el fallo?.

Código
  1. string almacen::leer_descifrado()
  2. {
  3. ifstream archivo;
  4. archivo.open(directorio, ifstream::in | ifstream::binary);
  5. archivo.seekg(0, ifstream::end);
  6. streampos tamaño = archivo.tellg();
  7. char *contenido = new char[tamaño]();
  8. archivo.seekg(0, ifstream::beg);
  9. archivo.read(contenido, tamaño);
  10. archivo.close();
  11. string ret = cifrador.desencriptar_AES((u_char*)contenido, tamaño);
  12. delete contenido;
  13. return ret;
  14. }

Una pregunta:

¿Los sucesivos montones de datos que meto cifrados tengo que descifrarlos uno a uno (pues estan separados por \0), o puedo leerlo todo pasarlo a descifrar y ya lo debería de hacer?, ¿ambas funcionan? ¿tengo que descifrar por bloques?. Es AES.

Saludos y gracias.

EDICION DELICATESSE:

Código
  1. string encriptador_AES::desencriptar_AES(u_char *_entrada, int _tamaño)
  2. {
  3. int p_len = _tamaño, f_len = 0;
  4. u_char *salida = (u_char*)malloc(p_len);
  5. EVP_DecryptInit_ex(&de, NULL, NULL, NULL, NULL);
  6. EVP_DecryptUpdate(&de, salida, &p_len, _entrada, _tamaño);
  7. EVP_DecryptFinal_ex(&de, salida + p_len, &f_len);
  8. for (int i = 0; i < _tamaño; i++)
  9. cout << salida[i];
  10. return string((char*)salida);
  11. }

Al pasar salida a (char*) en el primer \0 se corta la cadena y por eso mostraba solo el primer bloque, porque al final de cada bloque se añade un \0, solucionado pues era una chorrada, pero costo un poco encontrarla XD.