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)


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Seguridad
| | |-+  Criptografía (Moderador: kub0x)
| | | |-+  Libgcrypt paso a paso
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Libgcrypt paso a paso  (Leído 2,778 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
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


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines