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


Tema destacado:


  Mostrar Mensajes
Páginas: 1 ... 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 [178] 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 ... 235
1771  Programación / Programación C/C++ / Re: ¿Usas telegram? programa tu bot en C en: 1 Abril 2016, 15:38 pm
no le sacas partido a calloc ya que no veo para que te sirve que inicialize a 0 cuando luego lo sobrescribieras.

No seas vago. Es importante que el area en la que vas a escribir no tenga basura Me a pasado muchas veces que reservo exactamente la memoria que voy a usar + un byte. y algunas veces tu esperas que ese byte sea 0 y te quedas con esa idea y luego el programa empieza a hacer cosas raras y despues de pasara un rato depurando con GDB te das cuenta que la memoria tenia basura. cambias la instruccion a calloc o le agregas un memset despues del malloc y ahora todo funciona al 100.


Es todo correcto excepto lo de la condicion, la memoria asignada al puntero no la podes comparar de esa manera, de esa manera estas comparando la direccion a la que apunta el puntero con NULL y sera NULL con malloc o calloc en caso de fallo al reservar.

entiendo el punto, el codigo mostrado va cuando yo voy a liberar la memoria despues de usarla, si es que se usado,

Por ejemplo las funciones que ofresco para liberar la memoria

Código
  1. void telegram_free_updates(Updates *updates) {
  2. int i = 0;
  3. if(updates) {
  4. while(i < updates->length) {
  5. if(updates->list[i])
  6. telegram_free_update(updates->list[i]);
  7. i++;
  8. }
  9. memset(updates,0,sizeof(Updates));
  10. free(updates);
  11. }
  12. }
  13.  
1772  Programación / Programación C/C++ / Re: ¿Usas telegram? programa tu bot en C en: 1 Abril 2016, 14:32 pm
Como indica la documentacion de stdlib.

malloc y calloc reservan memoria. sin embargo no hay  garantia que la memoria reservada por malloc este limpia. A veces si a veces no.

calloc por otra parte es como malloc + memset(ptr,0,length). reserva memoria y la limpia. es importante tener la memoria limpia por que a veces haces condicidiones como:

Código:
if(ptr!=NULL)
{
free(ptr);
}

basta que exista un byte de basura en la memoria para que la condicion se cumpla y el programa se cuelgue por tratar de liberar memoria inexistente o en su defecto escribir en un area no reservada.

https://www.freebsd.org/cgi/man.cgi?query=calloc&sektion=3&apropos=0&manpath=redhat


Citar
calloc()    allocates memory for an array of nmemb   elements of size bytes
       each and   returns   a pointer to the allocated memory.  The   memory is  set
       to zero.

       malloc()    allocates  size  bytes   and returns a pointer to the allocated
       memory.   The memory is not cleared.
1773  Seguridad Informática / Criptografía / Re: Sistema de cifrado por lote de texto plano en: 1 Abril 2016, 06:50 am
Buen dia pues hice un pequeño programa para tu algoritmo.

La idea que tenia no a funcionado.

El enfoque era estadístico, lo que hice fue generar N arreglos de Enteros donde N es igual al numero de caracteres del mensaje.

El primer arreglo[0] es de longitud 1
El segundo arrega[1] es de longitud 2
y asi sucesivamente.

Guarde las sumas de los valores ascii de cada caracter en los arreglos. Ademas de contar cuantas veces se sumaba en cada caracter en cada casilla.

Saque los promedios y las desviaciones estandar ademas. saque el promedio de cada arreglo y las desviaciones estandar de las desviaciones estandar valga la redundancia...

Mi idea era ver como cambiaban las desviaciones estandar y me imaginaba que en los puntos de inflexion estaría la pista.

Curiosamente en algunos ejemplos el primer punto de inflexion coincidencia con la longitud de la contraseña, pero en otros no lo hacia.

Codigo:

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<errno.h>
  5. #include<sys/stat.h>
  6.  
  7. off_t fsize(const char *filename);
  8. unsigned char max(unsigned char item,unsigned char mx);
  9. unsigned char min(unsigned char item,unsigned char mn);
  10.  
  11. int main() {
  12. int **sums;
  13. int **counts;
  14. float **diff;
  15. float **promedios;
  16. float **desviacion;
  17. float *sumdesviaciones;
  18. float *promedioDesviaciones;
  19. float *diffdesviaciones;
  20. float *desviacion2;
  21. FILE *file;
  22. char *buffer;
  23. float temp;
  24. int l,i,j,k;
  25. file = fopen("salida.txt","r");
  26. if(file) {
  27. l = fsize("salida.txt");
  28. buffer = calloc(l+1,sizeof(char));
  29. fread(buffer,sizeof(char),l,file);
  30. fclose(file);
  31. sums = calloc(l,sizeof(int*));
  32. counts = calloc(l,sizeof(int*));
  33. diff = calloc(l,sizeof(float*));
  34. promedios = calloc(l,sizeof(float*));
  35. desviacion = calloc(l,sizeof(float*));
  36. sumdesviaciones = calloc(l,sizeof(float));
  37. promedioDesviaciones = calloc(l,sizeof(float));
  38. diffdesviaciones = calloc(l,sizeof(float));
  39. desviacion2 = calloc(l,sizeof(float));
  40. i = 0;
  41.  
  42. while(i < l) {
  43. sums[i] = calloc(i+1,sizeof(int));
  44. counts[i] = calloc(i+1,sizeof(int));
  45. diff[i] = calloc(i+1,sizeof(float));
  46. promedios[i] = calloc(i+1,sizeof(float));
  47. desviacion[i] = calloc(l,sizeof(float));
  48. i++;
  49. }
  50.  
  51. //rellenar array de sumas
  52. j = 0;
  53. while(j < l) {
  54. k =0;
  55. while(k < l) {
  56. //printf("Procesando sums[%i][%i]\n",j,(k % (j+1)));
  57. sums[j][k % (j+1)] += buffer[k];
  58. counts[j][k % (j+1)] +=1;
  59. k++;
  60. }
  61. j++;
  62. }
  63. //mostramos las sumas y los contadores
  64. i=1;
  65. j=0;
  66. while(j < l) {
  67. k =0;
  68. while(k < i) {
  69. //printf("sums[%i][%i] = %i\n",j,k,sums[j][k]);
  70. //printf("counts[%i][%i] = %i\n",k,i,counts[j][k]);
  71. k++;
  72. }
  73. i++;
  74. j++;
  75. }
  76. //calcular promedios
  77. i=1;
  78. j=0;
  79.  
  80. while(j < l) {
  81. k =0;
  82. while(k < i) {
  83. promedios[j][k] = ((float)sums[j][k])/((float)counts[j][k]);
  84. //printf("promedios[%i][%i] = %f\n",j,k,promedios[j][k]);
  85. k++;
  86. }
  87. i++;
  88. j++;
  89. }
  90. //calcular Diferencias
  91. j = 0;
  92. while(j < l) {
  93. k =0;
  94. while(k < l) {
  95. temp = promedios[j][k % (j+1)] - buffer[k];
  96. if(temp < 0.0) {
  97. temp = -1.0 *temp;
  98. }
  99. diff[j][k % (j+1)] += temp;
  100. k++;
  101. }
  102. j++;
  103. }
  104. //calcular desviacion
  105. i=1;
  106. j=0;
  107. while(j < l) {
  108. k =0;
  109. while(k < i) {
  110. desviacion[j][k] = diff[j][k]/counts[j][k];
  111. //printf("desviacion[%i][%i] = %f\n",j,k,desviacion[j][k]);
  112. k++;
  113. }
  114. i++;
  115. j++;
  116. }
  117.  
  118. //calcular suma desviaciones
  119. i=1;
  120. j=0;
  121. while(j < l) {
  122. k =0;
  123. while(k < i) {
  124. sumdesviaciones[j]+= desviacion[j][k];
  125. k++;
  126. }
  127. promedioDesviaciones[j] =  sumdesviaciones[j]/i;
  128. printf("promedio desviacion[%i] = %f\n",j,promedioDesviaciones[j]);
  129. i++;
  130. j++;
  131. }
  132. //calcular differencia de desviaciones
  133. i=1;
  134. j=0;
  135. while(j < l) {
  136. k =0;
  137. while(k < i) {
  138. diffdesviaciones[j]+= promedioDesviaciones[j] - desviacion[j][k];
  139. k++;
  140. }
  141. desviacion2[j] = diffdesviaciones[j]/(float)k;
  142. printf("desviacion2[%i] = %f\n",j,desviacion2[j]);
  143. i++;
  144. j++;
  145. }
  146.  
  147. printf("l : %i\n",l);
  148. }
  149. return 0;
  150. }
  151.  
  152. unsigned char max(unsigned char item,unsigned char mx) {
  153. return (item >= mx)? item:mx;
  154. }
  155.  
  156. unsigned char min(unsigned char item,unsigned char mn) {
  157. return (item <= mn)? item:mn;
  158. }
  159.  
  160. off_t fsize(const char *filename) {
  161. struct stat st;
  162. if (stat(filename, &st) == 0)
  163. return st.st_size;
  164. fprintf(stderr, "Cannot determine size of %s: %s\n",filename, strerror(errno));
  165. return -1;
  166. }
  167.  
  168.  
1774  Programación / Programación C/C++ / ¿Usas telegram? programa tu bot en C en: 1 Abril 2016, 06:30 am
Buen dia compañeros.

Quiero compartirles el proyecto en el que estoy trabajando.

Una interfaz en C para que programen su bot para telegram.

El codigo esta disponible en github, aun lo sigo mejorando y optimizando lo mas que pueda.
Casi todo el programa es memoria dimanica la cual  administra muy bien la aplicacion.

Ejemplo de uso.
Código
  1. /*
  2.  * Luis Alberto
  3.  * Twitter @albertobsd
  4.  */
  5.  
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<string.h>
  9. #include<curl/curl.h>
  10. #include<sys/stat.h>
  11. #include<errno.h>
  12. #include"telegram.h"
  13. #include"jsmn.h"
  14.  
  15. int main() {
  16. Updates *updates;
  17. User *user;
  18. Message *message;
  19. File *file;
  20. char **variables;
  21. char **valores;
  22. int i = 0;
  23. char *filename;
  24. telegram_init("123456789:zwxecrvtbynuyvbnmutyguhjdkeosdgjhfdouhn");
  25. user = telegram_getMe();
  26. if(!telegram_is_error()) {
  27. printf("User: id: %i\nusername: %s\n",user->id,user->username);
  28. telegram_free_user(user);
  29. }
  30. else {
  31. printf("%s\n",telegram_get_error());
  32. }
  33. updates = telegram_getUpdates();
  34. if(!telegram_is_error()){
  35. printf("updates: %i\n",updates->length);
  36. while(i < updates->length) {
  37. if(updates->list[i]->item.message->document) {
  38. printf("Document exits file_id : %s\n",updates->list[i]->item.message->document->file_id);
  39. file = telegram_getFile(updates->list[i]->item.message->document->file_id);
  40. if(!telegram_is_error()) {
  41. filename = telegram_downloadFile(file,updates->list[i]->item.message->document->file_name);
  42. printf("file name : %s\n",filename);
  43. }
  44. else {
  45. printf("%s\n",telegram_get_error());
  46. }
  47. }
  48. i++;
  49. }
  50. telegram_free_updates(updates);
  51. }
  52. else {
  53. printf("%s\n",telegram_get_error());
  54. }
  55. variables = calloc(5,sizeof(char*));
  56. valores = calloc(5,sizeof(char*));
  57. variables[0] = "chat_id";
  58. variables[1] = "text";
  59. valores[0] = "9219883";
  60. valores[1] ="Texto de prueba";
  61. message = telegram_sendMessage(telegram_build_post(variables,valores));
  62. if(!telegram_is_error()) {
  63. printf("OK %s\n",message->text);
  64. telegram_free_message(message);
  65. }
  66. else {
  67. printf("%s\n",telegram_get_error());
  68. }
  69. variables[1] = "caption";
  70. valores[1] = "Envio archivo";
  71. message = telegram_sendDocument("test_telegram",variables,valores);
  72. if(!telegram_is_error()) {
  73. printf("OK %s\n",message->text);
  74. telegram_free_message(message);
  75. }
  76. else {
  77. printf("%s\n",telegram_get_error());
  78. }
  79. return 0;
  80. }
  81.  
  82.  


Para trabajar con este ejemplo tenemos que te generar un token de autorización para nuestro bot y editar la linea de codigo:

Código
  1. telegram_init("123456789:zwxecrvtbynuyvbnmutyguhjdkeosdgjhfdouhn");

en este ejemplo procesamos las peticiciones:

getMe
getUpdates
sendDocument

Tambien que tenemos que sustituir el chat_id por el nuestro
El codigo depende de que tengamos instalado libcurl

Codigo en gihub

https://github.com/albertobsd/libtelegrambot

Saludos!
1775  Seguridad Informática / Criptografía / Re: Sistema de cifrado por lote de texto plano en: 29 Marzo 2016, 18:20 pm
Como tu lo comentas un ataque por estadistica podria arrojar algo de luz sobre la distribución / frecuencia de los datos.

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3.  
  4. int main() {
  5. char *pass = "HolaMundo";
  6. char *text = "QWERT456Y76U76I7OP6A756S7D567F6G7H56J7K67L6Ñ7Z56X7C567V65B7N65M7q56w2e3r2t41213yuiopasdfghjklzxcugjh877yvbty7t6645r311nm";
  7. int x = 1;
  8. char *name = "salida.txt";
  9. crypt(pass,text,x,name);
  10. return 0;
  11. }
  12.  

Hice este codigo para testear tu algoritmo, deja checo la salida y la analizo.

Cambie los length por strlen y cambie los bool por int para podrelo compilar sin errores, no se que compilador estes usando, en fin con los cambios que le hice funciona bien.

Esta fue la salida:

Citar
gF7Oe{%0HM%G4G2'I?L0)2G<'>$L&83X 8/%`&=3H5&y<MI'3i 3/%ME(2S >0$c&c2G`"_"*!f1By!-h-Xamr\T`V Y]i-aSoV"W*4Hbf\c1&f3G{%l"G `j
Saludos!
1776  Seguridad Informática / Criptografía / Re: Sistema de cifrado por lote de texto plano en: 29 Marzo 2016, 17:50 pm
Practico el ejemplo, para fines de aprendizaje sobre sistemas de cifrados es buen trabajo, aun que realmente seguro no es.

Lo de agregar texto random suena bien, sin embargo la seguridad atravez de la oscuridad no estan segura.

Aun asi buen ejemplo para fines practicos.
1777  Seguridad Informática / Criptografía / Libgcrypt paso a paso en: 29 Marzo 2016, 17:44 pm
Muy buen dia, este sera un pequeño taller para entender un poco mas sobre criptografía paso a paso usando lenguaje C y la libreria Libgcrypt.

Nota para el moderador Lo pongo en Cryptografia  y no en C/C++ por ver el detalle de los conceptos criptograficos.

Asi podremos observar paso paso el contenido de la memoria  :silbar: y como esta cambia.

Antes de programar con libgcrypt yo solo sabia los conceptos básicos de Criptografia pero en general desconocía a grandes rasgos la forma interna de trabajar de programas como GnuPG entre otros.

Los códigos que pondré aqui estan a su disposición para practicar con la librería y los conceptos criptográficos y estan disponibles en github

https://github.com/albertobsd/libgcrypt-examples

Creacion de par de Claves RSA

Bien el primer tema sera crear una clave RSA de cierta cantidad de bits y ver como esta esta clave en la memoria.

El primer ejemplo esta bajo el nombre RSA_2048.c aunque en realidad el ejmplo crea un par claves de 4096 bits
https://github.com/albertobsd/libgcrypt-examples/blob/master/RSA_2048.c

El programa genera un nuevo par de claves RSA de 4096 bits y los guarda en formato S-Expresion en un archivo llamado clave.txt por si tienen ese archivo ya existente con datos seria sobreescrito.

El codigo y luego explicare las partes interesantes por serparado.
Código
  1. /*
  2. Twitter @albertobsd
  3. cc -o RSA_2048 RSA_2048.c `libgcrypt-config --cflags --libs`
  4. Prueba de generacion de claves RSA 2048 y 4096 bits.
  5. */
  6.  
  7. #include<stdio.h>
  8. #include<gcrypt.h>
  9.  
  10. int main() {
  11. FILE *f = NULL;
  12. gcry_sexp_t rsa_parms = NULL;
  13. gcry_sexp_t rsa_keypair = NULL;
  14. gcry_error_t err = 0;
  15. char *buffer;
  16. size_t length = 4;
  17. size_t offset = 0;
  18. err = gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);
  19. err |= gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);
  20. err |= gcry_control (GCRYCTL_RESUME_SECMEM_WARN);
  21. err |= gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
  22. if(err) {
  23. fprintf(stderr,"gcrypt: failed initialization");
  24. exit(0);
  25. }
  26. err = gcry_sexp_build(&rsa_parms, NULL, "(genkey (rsa (nbits 4:4096)(rsa-use-e 1:1)))");
  27. if (err) {
  28. fprintf(stderr,"gcrypt: failed initialization");
  29. exit(0);
  30. }
  31. length = gcry_sexp_sprint(rsa_parms,GCRYSEXP_FMT_CANON,NULL,0);
  32. buffer = calloc(length,sizeof( char));
  33. offset = gcry_sexp_sprint(rsa_parms,GCRYSEXP_FMT_CANON,buffer,length);
  34. printf("Buffer size %i\n",length);
  35. printf("Buffer offset %i\n",offset);
  36. printf("%s\n",buffer);
  37. memset(buffer,0,length);
  38. err = gcry_pk_genkey(&rsa_keypair, rsa_parms);
  39. if (err) {
  40. fprintf(stderr,"gcrypt: failed initialization");
  41. exit(0);
  42. }
  43. length = gcry_sexp_sprint(rsa_keypair,GCRYSEXP_FMT_CANON,NULL,0);
  44. buffer = realloc(buffer,length*sizeof(char));
  45. offset = gcry_sexp_sprint(rsa_keypair,GCRYSEXP_FMT_CANON,buffer,length);
  46.  
  47. printf("Buffer size %i\n",length);
  48. printf("Buffer offset %i\n",offset);
  49. printf("%s\n",buffer);
  50. f = fopen("clave.txt","w");
  51. if(f) {
  52. fwrite(buffer,sizeof(char),offset,f);
  53. fclose(f);
  54. }
  55. memset(buffer,0,length);
  56. free(buffer);
  57. gcry_sexp_release(rsa_keypair);
  58. gcry_sexp_release(rsa_parms);
  59. }
  60.  

Si bien no entrare en algunos de los detalles de libgcrypt eso queda a tarea del lector.

Código
  1. gcry_sexp_build(&rsa_parms, NULL, "(genkey (rsa (nbits 4:4096)(rsa-use-e 1:1)))");

La funcion anterior solo genera una cadena en formato S-expresion con instrucciones para posteriormente generar un par de claves:

Código
  1. "(genkey (rsa (nbits 4:4096)(rsa-use-e 1:1)))"

Si queremos crear un par de clave de 1024 bits solo cambiaremos el 4096 por 1024 y asi susesivamente.

Si ejecutamos el programa veremos un salida similar a la siguiente:

Código:
Buffer size 49
Buffer offset 48
(6:genkey(3:rsa(5:nbits4:4096)(9:rsa-use-e1:1)))
Buffer size 2441
Buffer offset 2440
(8:key-data(10:public-key(3:rsa(1:n513:

Veamos informamos de cuanta memoria se uso para el buffer y acontinuacion vemos una cadena similar a la que le pasamos al programa:

Citar
(6:genkey(3:rsa(5:nbits4:4096)(9:rsa-use-e1:1)))

por ejemplo:
6:genkey <-6 bytes
3:rsa <- 3bytes
5:nbits <- 5 bytes
4:4096 <- 4 bytes
etc...

Generamos la clave:

Código
  1. gcry_pk_genkey(&rsa_keypair, rsa_parms);

La guardamos en un buffer con memoria previamente reservada:

Código
  1. offset = gcry_sexp_sprint(rsa_keypair,GCRYSEXP_FMT_CANON,buffer,length);


La imprimimos en pantalla

Código
  1. printf("%s\n",buffer);

pero bien la salida al parecer esta trunca:

Citar
Buffer size 2441
Buffer offset 2440
(8:key-data(10:public-key(3:rsa(1:n513:

Para esto guardamos el buffer completo en un archivo:

Código:
fwrite(buffer,sizeof(char),offset,f);

Y si revisan el contenido del archivo veran  :o :o :o el formato completo de las claves en el formato descrito en la documentacion de libgcrypt

Citar

(private-key
  (rsa
    (n n-mpi)
    (e e-mpi)
    (d d-mpi)
    (p p-mpi)
    (q q-mpi)
    (u u-mpi)))

(public-key
  (rsa
    (n n-mpi)
    (e e-mpi)))

+ Otros  datos

https://gnupg.org/documentation/manuals/gcrypt/RSA-key-parameters.html#RSA-key-parameters
1778  Seguridad Informática / Criptografía / Proteger par de claves RSA en: 29 Marzo 2016, 15:06 pm
Buen dia foro. Estoy viendo las alternativas para proteger el par de claves RSA.

Tengo este programa en el que estoy trabajando, un projecto personal.

El programa genera el par de claves RSA de 1024 o 2048 con la API de libgcrypt, ya puedo cifrar y firmar los archivos con dicha clave.

El programa es mas o menos autonomo, he visto que normalmente se trabaja con un password para cifrar las claves con AES o algun otro algoritmo de cifrado simetrico, y asi solo la persona que conoce el password tiene acceso al par de claves.

Pero como mi programa es autonomo estoy buscando una alternativa mis idias son las siguientes.

  • Buscar un tipo de UUID en la maquina y usar su sha256 de password
  • Generar un archivo random y usar su sha256 de password
  • hardcodear el password en la aplicacion (mala idea) pero es una opcion

¿Alguna otra?

¿Que suguieren ustedes?

Saludos.
1779  Seguridad Informática / Seguridad / Re: Red de comunicacion (Anonima, Segura) en: 26 Marzo 2016, 15:17 pm
Muy buen dia.

Depues de 7 dias de estar jugando con la API de telegram he escrito una interaz para usarla en lenguaje C.

Libtelegrambot

Si alguien quiere usarla y practicar con ella para los fines que quiera esta disponible. Pueden reportar fallas en la pagina de github

Ya con la interfaz lista voy a comenzar una sección genérica de comunicación en mi programa
Asi si un dia decido de cambiar de canal, solo tendre que cambiar las llamadas de mi sección a una nueva API o plataforma.

ejemplo:

Ahora
Citar
progama_getUpdates() {
  telegram_getUpdates();
}

En caso de cambiar de plataforma
Citar
progama_getUpdates() {
  another_getUpdates();
}

1780  Seguridad Informática / Seguridad / Re: Red de comunicacion (Anonima, Segura) en: 19 Marzo 2016, 23:04 pm
Estaba pensando en los pros y contras antes de irme a dormir y amaneci con esas mismas ideas.

Estoy viendo otras opciones como
:https://core.telegram.org/

Aun asi, al igual que los otros metodos tambien esta el riesgo que terminen quitando el canal de comunicación.


Saludos!.

Páginas: 1 ... 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 [178] 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 ... 235
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines