El texto descifrado está casi bien, pero muestra basura en el texto descifrado del principio de los montones.
"hoy hace un buen dia" -> cifro : "isewug0uwe0igj" -> al descifrar "iqh39h buen dia".
Esto pasa con todos los montones de datos que descifro menos con el primero que se mantiene intacto, os dejo el código para que me podáis ayudar:
Clase que cifra, la clase "bytes" es un typedef tuple<u_char*,int> contenido y tamaño de los datos cifrados o descifrados.
Código
bool encriptador_AES::inicializar_AES(string _contraseña, int _rondas) { u_char key[32], iv[32]; u_int salto[2] = { MINIMO_SALTO, MAXIMO_SALTO }; if (EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1(), (u_char*)&salto, (u_char*)_contraseña.c_str(), _contraseña.length(), _rondas, key, iv) != 32) return false; EVP_CIPHER_CTX_init(&en); EVP_EncryptInit_ex(&en, EVP_aes_256_cbc(), NULL, key, iv); EVP_CIPHER_CTX_init(&de); EVP_DecryptInit_ex(&de, EVP_aes_256_cbc(), NULL, key, iv); return true; } bytes encriptador_AES::encriptar_AES(u_char *_entrada, int _tamaño) { int c_len = _tamaño + AES_BLOCK_SIZE, f_len = 0; u_char *salida = (u_char*)malloc(c_len); EVP_EncryptInit_ex(&en, NULL, NULL, NULL, NULL); EVP_EncryptUpdate(&en, salida, &c_len, _entrada, _tamaño); EVP_EncryptFinal_ex(&en, salida + c_len, &f_len); return bytes(salida, c_len + f_len); } string encriptador_AES::desencriptar_AES(u_char *_entrada, int _tamaño) { int p_len = _tamaño, f_len = 0; u_char *salida = (u_char*)malloc(p_len); EVP_DecryptInit_ex(&de, NULL, NULL, NULL, NULL); EVP_DecryptUpdate(&de, salida, &p_len, _entrada, _tamaño); EVP_DecryptFinal_ex(&de, salida + p_len, &f_len); string ret; for (int i = 0; i < p_len + f_len; i++) ret += salida[i]; delete salida; return ret; }
Clase almacen que escribe en un fichero en binario los datos cifrados y los lee y los descifra:
Código
almacen::almacen(string _directorio) { directorio = _directorio; cifrador.inicializar_AES(CLAVE_AES, 5); } void almacen::escribir_cifrado(bytes _datos) { ofstream archivo; archivo.open(directorio, ofstream::app | ofstream::binary); _datos = cifrador.encriptar_AES(get<CONTENIDO>(_datos), get<TAMAÑO>(_datos)); archivo.write((char*)get<CONTENIDO>(_datos), get<TAMAÑO>(_datos)); archivo.close(); } string almacen::leer_descifrado() { //probar que vaya parte a parte mejor, en vez de entera. ifstream archivo; archivo.open(directorio, ifstream::in | ifstream::binary); archivo.seekg(0, ifstream::end); streampos tamaño = archivo.tellg(); char *contenido = new char[tamaño](); archivo.seekg(0, ifstream::beg); archivo.read(contenido, tamaño); archivo.close(); string ret = cifrador.desencriptar_AES((u_char*)contenido, tamaño); delete contenido; return ret; }
En una función introduzco el texto para que sea cifrado de esta manera, siendo contenido un string con los datos en texto plano:
Código:
_archivo.escribir_cifrado(bytes((u_char*)contenido.c_str(), contenido.length()));
De esta manera se escriben los datos cifrados en el archivo.
Pasado un rato abro el programa y descifro:
Código
int main(){ almacen o("C:\\Users\\username\\Desktop\\PRUEBA.txt"); cout << o.leer_descifrado(); }
Me muestra el primer bloque entero, y los demás parcialmente enteros, se come el principio de cada bloque y muestra basura, ¿quizás deba de añadir tras añadir un bloque cifrado al archivo?, nose.
Os dejo este link, donde me he basado para implementar el cifrado AES:
http://snipplr.com/view/83706/aes-encryptiondecryption-demo-program-using-openssl-evp-apis/
Muchas gracias y un saludo, se agradece la ayuda, cualquier cosa que necesitéis la subiré.
Ejemplo de salida descifrada:
Citar
Fecha: Fri Oct 30 14:19:35 2015
Proceso: explorer.exe
Pesta±a: Program Manager
Contenido: hjghjghjgh║;!=úìõ│¡Ð╣ã830 14:19:37 2015
Proceso: cmd.exe
Pesta±a: C:\WINDOWS\system32\cmd.exe
Contenido: ghjghjghjghÍ 3'KÏü¢sCbÌûhð30 14:19:38 2015
Proceso: explorer.exe
Pesta±a: Program Manager
Contenido: ghjghjgh
Proceso: explorer.exe
Pesta±a: Program Manager
Contenido: hjghjghjgh║;!=úìõ│¡Ð╣ã830 14:19:37 2015
Proceso: cmd.exe
Pesta±a: C:\WINDOWS\system32\cmd.exe
Contenido: ghjghjghjghÍ 3'KÏü¢sCbÌûhð30 14:19:38 2015
Proceso: explorer.exe
Pesta±a: Program Manager
Contenido: ghjghjgh
Como véis el primer bloque está entero, el segundo muesra basura en vez de mostrar "\nFecha: Fri Oct 30 ", así ocurre con el resto de bloques posteriores.
¿Puede ser fallo al escribir y leer? ¿o fallo al cifrar y descifrar?