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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Temas
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19
71  Programación / Programación C/C++ / 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?
72  Programación / Programación C/C++ / Error sobre cifrado AES 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.
73  Seguridad Informática / Seguridad / Duda acerca de claves RSA en: 27 Octubre 2015, 17:03 pm
Hola, no entiendo la seguridad de las claves publicas/privada.

Supongamos que genero una clave privada como hace facebook.com que va sobre SSL, entonces que tengo que hacer yo para generar una clave pública para facebook.com y poder descifrar los datos del otro extremo, ¿acaso facebook me da una clave pública o la genero yo?, y si es asi ¿como?.

La verdad quiero implementar una red p2p, y para poder hacer actualizaciones sobre la misma necesito una clave RSA y firmar los datos que mande en este caso comandos para que otro no pueda hacerlo sin la clave, ya tengo openssl, pero sigo sin entender como debería hacerlo.

Supongamos que los usuarios tienen clave pública, y yo tengo la privada, entonces yo les mando comandos a ellos, ellos con su clave pública descifran y ven el comando luego lo ejecutan, pero si hacen ingeniería inversa al usuario podrían crearme una clave privada que funcione con las claves públicas del bot no?.

¿Como debería de establecer esa conexión segura insuplantable a no ser que tuvieran mi clave?.

He estado leyendo y buscando pero no me queda claro como se genera la clave pública, quien la manda y como se acepta, pues si otro que no soy yo manda su clave publica y ya tiene su clave privada podría conectarse también.

Saludos, seguiré viendo poco a poco, gracias.
74  Foros Generales / Foro Libre / Estados Unidos destruye central térmica de Alepo en: 26 Octubre 2015, 17:18 pm
En los medios occidentales no hay nada que hable de esto, me pregunto si será verdad, RT parece afirmar que estados unidos destruyo la central térmica de Alepo y varios transformadores dejando sin luz a 2,5 millones de personas, en la capital del gobierno sirio de Al assad. Vergonzoso.

https://actualidad.rt.com/actualidad/189668-coalicion-eeuu-siria-medios
http://www.diario-octubre.com/?p=19802

Saludos.
75  Programación / Programación C/C++ / Duda acerca de macros en: 26 Octubre 2015, 11:25 am
Hola, tengo un archivo de cabecera donde defino numerosas macros para el proyecto, a partir de la directiva de preprocesador #define.

Pero para definir strings no puedo usar la directiva, por ello creo que es mejor usar "extern const string variable_global", pero en un archivo de cabecera no puedo inicializarla.

Entonces surge el problema.

Si la inicializo en otro archivo sea cual sea, quedará inicializada con ese  valor para todos los demás ¿no?.

Si en el main inicializo todas, o a partir de otra función, esa variable queda definida ya para todos los .cpp ¿no?

Saludos y gracias.

Edito: O poner en el archivo header las variables como:

Código
  1. extern const string str1;
  2. extern const string str2;

Y en el .cpp poner:

Código
  1. extern const string str1 = "idudifu";
  2. extern const string str2="difaodhfio";

Al compilar el proyecto y añadir el header en todos los .cpp estos podrán usar las macros ya inicializadas no?

Edito: O bueno siempre se puede usar la opción sencilla y mala, de declararlas directamente en el header como string o lo que sean e incluir el header para cada .cpp que lo necesite, en ese caso se compilarán para cada .cpp varias veces (supongo que #define hará lo mismo), pero sería mucho más sencillo.

He probado a declarar el extern y me ha dado 300 fallos not the way.
76  Programación / Desarrollo Web / [Resuelto] Enviar texto a una url con javascript en: 19 Octubre 2015, 22:04 pm
En plan quiero hacer una función en js que cuando se ejecute mande una cadena de texto como "hola mundo" a un servidor remoto, en este caso a localhost.

¿Se puede hacer? ¿alguna idea?

Buscare mientras.

Gracias y un saludo.

Edito: XD quizás :

Código
  1. function send(var cadena)
  2. {
  3. url = encodeURI("http://"+ "127.0.0.1" + "/cadena);
  4. $("#selector").load(url);
  5. }

El problema de esto es que quiero que lo mande en plan sockets, porque el servidor se corre en localhost, y es un server en cpp que estoy haciendo y no podrá tomar esta orden... mm ¿como podría mandarle datos?.

El servidor escucha todo lo que se le mande, pero con este método no mandamos cosas al server solo nos conectamos a el y solicitamos un archivo de este..mm
77  Programación / Programación C/C++ / Clase contenedora de bytes en: 18 Octubre 2015, 17:30 pm
Buenas, necesito escribir en un archivo y busco una clase contenedora de bytes, como por ejemplo podría ser vector<byte>, pero me vendría mejor una clase especializada, al igual que lo es string para cadenas de caracteres.

¿alguno sabe que clase es la que busco o si existe?, me vendría bien con métodos como find() etc.

Un saludo.
78  Programación / Programación C/C++ / Instalar openssl en visual studio 2013 en: 16 Octubre 2015, 10:33 am
Buenas, alguien lo ha instalado y me podría ayudar, ¿que necesito exactamente conseguir?.

Necesito una librería (estática) y que parte del código debería incluir, y ¿no puedo conseguir la librería ya compilada?, ¿porque se necesita una librería para cada versión de MVS?.

Saludos.

Me he bajado de aqui:

http://www.npcglib.org/~stathis/blog/precompiled-openssl/

Las librerias estaticas .lib para visual studio 13 y las he incluido como hice con winpcap, pero da error en los #include dince que no encuentra archivo.

Saludos.

La pregunta es ¿porque tengo que ejecutar un batch para compilarla, ¿porque no la dan ya compilada para la version de visual studio?.

EDICION DELICATESSE: ¡Conseguido!, me baje las compiladas, tenía un error en el directorio de include, era ...\include y tenía ...\include\openssl por eso no me reconocía las cabeceras, era una tontería, aunque sigo preguntandome porque hay varias versiones de compilación para cada MVS XD, no debería de valer una para todos.

Poner la de 32 bits, y librería estática mejor.

Saludos.
79  Programación / Programación C/C++ / Duda sobre parametros de una función C++ en: 14 Octubre 2015, 10:19 am
La pregunta es, ¿cual de las 2 debería de hacer?

¿En este caso sería indiferente verdad?, puesto que vector<victima> _victimas es fijo, cuando lo paso como parametro reserva memoria en el metodo, y si hago cambios fuera del método no afectan al argumento que he pasado ¿no?, distinto de si fuera un puntero.

Código
  1. lista_victimas::lista_victimas(vector<victima> _victimas)
  2. {
  3. victimas = _victimas;
  4. //copy(_victimas.begin(), _victimas.end(), back_inserter(victimas));
  5. }

Cuando acaba un método, sus parametros se borran de memoria ¿no?. En este caso, ¿que hago, igualar punteros contenidos o que?.

Código
  1. void funcion(lista_victimas *_lista)
  2. lista_victimas lista;
  3. //añado miembros.
  4. mvictimas->lock();
  5. _lista = new lista_victimas(lista.obtener_victimas());
  6. mvictimas->unlock();

Ese código , asignaría en _lista otro puntero en la heap, pero que ocurriría con el que ya había.

Si en cambio igualo _lista = &lista; al perderse &lista al salir de la funcion que ocurriría con _lista despues?.

Saludos, estoy algo liado.
80  Informática / Software / ¿Se puede programar un "teléfono" que reciba mensajes? en: 11 Octubre 2015, 19:09 pm
La idea es saber si se puede crear una aplicación que actúe como teléfono, ya bien sea creando su propio número o suplantando otro...

Skype permite hacer llamadas a telefonos por internet, hay programas que permiten hacer llamadas de telefono, ¿no se puede crear un servidor que haga de teléfono, capaz de recibir mensajes SMS etc?.

¿es posible de alguna forma?.

Saludos.
Páginas: 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines