elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con cifrado AES
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con cifrado AES  (Leído 2,135 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Problema con cifrado AES
« en: 30 Octubre 2015, 14:18 pm »

Hola de nuevo, tengo un archivo donde introduzco montones de datos cifrados de uno en uno, y luego lo descifro a la vez todo y muestro una cadena.

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
  1. bool encriptador_AES::inicializar_AES(string _contraseña, int _rondas)
  2. {
  3. u_char key[32], iv[32];
  4. u_int salto[2] = { MINIMO_SALTO, MAXIMO_SALTO };
  5. 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)
  6. return false;
  7. EVP_CIPHER_CTX_init(&en);
  8. EVP_EncryptInit_ex(&en, EVP_aes_256_cbc(), NULL, key, iv);
  9. EVP_CIPHER_CTX_init(&de);
  10. EVP_DecryptInit_ex(&de, EVP_aes_256_cbc(), NULL, key, iv);
  11. return true;
  12. }
  13.  
  14. bytes encriptador_AES::encriptar_AES(u_char *_entrada, int _tamaño)
  15. {
  16. int c_len = _tamaño + AES_BLOCK_SIZE, f_len = 0;
  17. u_char *salida = (u_char*)malloc(c_len);
  18. EVP_EncryptInit_ex(&en, NULL, NULL, NULL, NULL);
  19. EVP_EncryptUpdate(&en, salida, &c_len, _entrada, _tamaño);
  20. EVP_EncryptFinal_ex(&en, salida + c_len, &f_len);
  21. return bytes(salida, c_len + f_len);
  22. }
  23.  
  24. string encriptador_AES::desencriptar_AES(u_char *_entrada, int _tamaño)
  25. {
  26. int p_len = _tamaño, f_len = 0;
  27. u_char *salida = (u_char*)malloc(p_len);
  28. EVP_DecryptInit_ex(&de, NULL, NULL, NULL, NULL);
  29. EVP_DecryptUpdate(&de, salida, &p_len, _entrada, _tamaño);
  30. EVP_DecryptFinal_ex(&de, salida + p_len, &f_len);
  31. string ret;
  32. for (int i = 0; i < p_len + f_len; i++) ret += salida[i];
  33. delete salida;
  34. return ret;
  35. }

Clase almacen que escribe en un fichero en binario los datos cifrados y los lee y los descifra:

Código
  1. almacen::almacen(string _directorio)
  2. {
  3. directorio = _directorio;
  4. cifrador.inicializar_AES(CLAVE_AES, 5);
  5. }
  6.  
  7. void almacen::escribir_cifrado(bytes _datos)
  8. {
  9. ofstream archivo;
  10. archivo.open(directorio, ofstream::app | ofstream::binary);
  11. _datos = cifrador.encriptar_AES(get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
  12. archivo.write((char*)get<CONTENIDO>(_datos), get<TAMAÑO>(_datos));
  13. archivo.close();
  14. }
  15.  
  16. string almacen::leer_descifrado()
  17. {
  18. //probar que vaya parte a parte mejor, en vez de entera.
  19. ifstream archivo;
  20. archivo.open(directorio, ifstream::in | ifstream::binary);
  21. archivo.seekg(0, ifstream::end);
  22. streampos tamaño = archivo.tellg();
  23. char *contenido = new char[tamaño]();
  24. archivo.seekg(0, ifstream::beg);
  25. archivo.read(contenido, tamaño);
  26. archivo.close();
  27. string ret = cifrador.desencriptar_AES((u_char*)contenido, tamaño);
  28. delete contenido;
  29. return ret;
  30. }

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
  1. int main(){
  2. almacen o("C:\\Users\\username\\Desktop\\PRUEBA.txt");
  3. cout << o.leer_descifrado();
  4. }

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

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?


« Última modificación: 30 Octubre 2015, 14:24 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Problema con cifrado AES
« Respuesta #1 en: 30 Octubre 2015, 15:31 pm »

el bloque que sale erróneo es de longitud fija? o varía?

siempre sigues este patrón o similar?

Código:
ghjghjgh


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema con cifrado AES
« Respuesta #2 en: 30 Octubre 2015, 15:45 pm »

Es de longitud variable, yo tengo una cadena que quiero meter en mi archivo cifrada, lo hago de esta forma:

_archivo.escribir_cifrado(bytes((u_char*)contenido.c_str(), contenido.length()));

La variable contenido suele tener esta forma:

Citar
Fecha: Fri Oct 30 14:19:35 2015
Proceso: explorer.exe
Pesta±a: Program Manager
Contenido: hjghjghjgh

Donde "hjhjhjhjhj", son las teclas que pulso, la fecha el momento que las pulso, el proceso donde las pulso y el nombre de pestaña donde las pulso, todos esos datos están en la string contenido, entonces los envió al archivo através del método "escribir_cifrado", lo paso a u_char* y el tamaño.

Si pulso otras teclas, serán las que pulse las que aparezcan al final de contenido.

El programa es como un keyloguer que cuando cambiamos de ventana guarda los datos que capturo en ella y los escribe cifrados en el archivo.

Así pues cada vez que cambio de pestaña y escribo en otra, se mete un nuevo monton de datos cifrado al archivo, tras hacer unas pruebas y guardar 3 o 4 montones de datos en el archivo cierro el programa, y pruebo a desencriptarlo.

Pero la salida tiene esos errores que he mostrado antes, muestra basura al descifrar el comienzo de los bloques, excepto del primero que no lo hace.

Saludos y gracias.

Iré añadiendo nueva info conforme vaya haciendo más pruebas, un saludo.

Edito: Creo que no es problema del cifrado sino de escritura en el archivo, al escribir un monton detrás de otro creo que algo se hace mal, el método write será lo correcto? o me paso a FILE...?.
« Última modificación: 30 Octubre 2015, 17:49 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Problema con cifrado AES
« Respuesta #3 en: 1 Noviembre 2015, 15:03 pm »

Bueno, tras leer y seguir haciendo comprobaciones el problema estaba en EVP_DecryptUpdate y que soy todo un principiante en esto, ahí lo que ponía era todo lo que leía del archivo (todos los bloques con distintos tamaños que incluí), y el tamaño del archivo (tamaño de los bytes de los bloques), el problema está en que tengo que ir metiendo bloque a bloque.

La solución pasa por meter siempre un bloque del mismo tamaño y si son muchos datos meter más bloques (por si no entran), luego sería leer el archivo dividir entre el tamaño fijo del bloque e ir descifrando bloque a bloque y lo tendríamos.

El error era garrafal, buscaré a a ver como puedo cifrar siempre tomando el mismo tamaño. E ire uno a uno.

Saludos.

Edito: Para interesados sobre como solucioné el problema:

https://xkcd.com/323/


« Última modificación: 1 Noviembre 2015, 15:31 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con password cifrado
Criptografía
Bl4ckSh4d0w 1 4,271 Último mensaje 19 Marzo 2012, 03:13 am
por Anonymous250
¡URGENTE! problema cifrado 802.1x
Hacking Wireless
apoeti 2 2,747 Último mensaje 10 Julio 2012, 12:48 pm
por apoeti
Problema con cifrado HTTPS
Seguridad
mester 3 2,848 Último mensaje 11 Agosto 2015, 21:16 pm
por engel lex
[Ayuda][Problema]Cifrado de Transposición por grupos en c
Programación C/C++
jhonla 0 2,074 Último mensaje 23 Enero 2017, 11:24 am
por jhonla
Problema cifrado sm-t805
Dispositivos Móviles (PDA's, Smartphones, Tablets)
hakin1986 0 2,028 Último mensaje 26 Octubre 2017, 18:07 pm
por hakin1986
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines