Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 31 Octubre 2015, 11:39 am



Título: Ofstream escribe bytes corruptos o Ifstream los lee
Publicado por: Kaxperday en 31 Octubre 2015, 11:39 am
Hola a todos, ya me aproximo al problema con el cifrado/descifrado AES.

El cifrado y descifrado está bien, el problema es lo que escribe en el archivo, pues aparecen bytes que no deberían estar.

Aquí muestro el contenido 2 cadenas que voy a escribir en el archivo una detrás de la otra, las 2 contienen lo mismo por ello son iguales. Son dos bloques de 48 bytes.
En total el archivo tiene 96 bytes perfecto.

Bytes primer bloque a escribir en el archivo en modo binario / append:
Citar
94 249 51 202 90 217 244 156 231 225 66 150 255 32 117 186 176 251 152 112 108 145 21 73 191 125 236 214 142 28 241 168 189 174 119 131 212 52 158 203 78 199 245 64 206 37 113 36

Bytes segundo bloque a escribir en el archivo en modo binario / append:
Citar
94 249 51 202 90 217 244 156 231 225 66 150 255 32 117 186 176 251 152 112 108 145 21 73 191 125 236 214 142 28 241 168 189 174 119 131 212 52 158 203 78 199 245 64 206 37 113 36

Ahora bien, tras escribir una, y escribir la otra encima de la una, aparecen unos bytes de por medio que no deberían de salir:

Bytes de los dos bloques que aparecen al leer el archivo de nuevo en modo in / binary:
Citar
94 249 51 202 90 217 244 156 231 225 66 150 255 32 117 186 176 251 152 112 108 145 21 73 191 125 236 214 142 28 241 168 189 174 119 131 212 52 158 203 78 199 245 64 206 37 113 36 205 253 253 253 253 173 0 0 54 208 248 159 44 173 0 0 128 183 93 0 144 92 93 0 8 236 93 0 192 0 93 0 32 208 249 136 35 173 0 8 184 182 93 0 64 98 93 0

Luego al descifrar, salen cosas corruptas normal, además descifra todo correctamente menos los bytes corruptos, pero ¿porque salen?, os dejo el código donde hago la prueba:

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. for (int i = 0; i < get<TAMAÑO>(_datos); i++)
  7. {
  8. cout << (int)get<CONTENIDO>(_datos)[i] << " ";
  9. }
  10. cout << endl << endl;
  11. archivo.write((char*)get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
  12. archivo.close();
  13.  
  14. ifstream archivo2;
  15. archivo2.open(directorio, ifstream::in | ifstream::binary);
  16. archivo2.seekg(0, ifstream::end);
  17. int man = archivo2.tellg();
  18. archivo2.seekg(0, ifstream::beg);
  19. cout << man;
  20. char *contenido = new char[man]();
  21. archivo2.read(contenido, man);
  22.  
  23. archivo2.close();
  24. for (int i = 0; i < man; i++)
  25. {
  26. cout << (int)get<CONTENIDO>(_datos)[i] << " ";
  27. }
  28. system("pause");
  29. }

Las cadenas encriptadas están bien, pero al obtenerlas ya bien sea causa de porque fueron escritas en el fichero de forma errónea, o porque al leer se corrompieron lo que recibo no concuerda con lo que dije que escribiera.

¿Qué podrá pasar?, un saludo.

Edito: Descartamos que escribe mal en el archivo porque esto es o que tine al abrir con el bloc de notas:

Citar
^ù3ÊZÙôœçáB–ÿ uº°û˜pl‘I¿}ìÖŽñ¨½®wƒÔ4žËNÇõ@Î%q$^ù3ÊZÙôœçáB–ÿ uº°û˜pl‘I¿}ìÖŽñ¨½®wƒÔ4žËNÇõ@Î%q$

Como se puede observar, los 2 bloques son iguales, y empiezan por "^ù3ÊZ", luego parece que escribe bien, el problema está en la lectura y la carga en un buffer.


Título: Re: Ofstream escribe bytes corruptos o Ifstream los lee
Publicado por: ivancea96 en 31 Octubre 2015, 13:25 pm
Sé concreto en la pregunta, si tu problema es la lectura del archivo, entonces el problema es ese, no menciones cifrados ni descifrados, si no son parte de la pregunta.
Aisla el código erróneo. Depura, y encuentra las líneas en las que se encuentra al irregularidad.