Whatsapp criptografia End-to-End

Iniciado por AlbertoBSD, 6 Abril 2016, 01:59 AM

0 Miembros y 2 Visitantes están viendo este tema.

AlbertoBSD

#10
Cita de: engel lex en  6 Abril 2016, 23:21 PM
la llave publica es para ser pasada en plano, no tiene sentido protegerla XD para protegerla solo harías una llave publica de una llave publica...

la llave publica es como mandar un candado abierto, solo puede ser usada para cerrar el mensaje... no puede hacerse más nada con ella

Claro, cuando se genera un PAR de llaves una es publica y la otra privada. La llave publica se envia a las personas con las que te quieres comunicar entiendo eso y si la llave publica se tranmite en texto plano

Tengo muy claro eso.

Ahora si leemos la documentaion El Message Key contiene un total de 80 de los cuales esta didivido en 3 secciones.


  • 32 bytes AES password
  • 32 bytes HMAC
  • 16 bytes IV

Entonces eso solo compone el Message Key.
El mensaje Cifrado es otra parte de la Data enviada y de nada serviria mandar algo cifrado si tambien vamos a mandar la llave en los 80 bytes anteriores. Recordemos que AES es un sistema para cifrado simetrico.

Y por lo tanto supongo que esos 80 bytes se mandan cifrados con criptografia asimetrica..

Insito en esto por que estoy programando un projecto con necesidades similares y me gustaria tomar las mejores ideas, no se tal vez no me explico bien y/o estoy omitiendo algo en la lectura o en mis bases criptograficas. Omito cosas con mucha facilidad.

Whatsapp no es de codigo abierto.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

engel lex

#11
pero es que hace toooda la transmision asimetrica es muy pesada, lo que hace incluso el https es que establece una clave común al azar muy pesada para in cifrado simetrico (fb usa AES128, google y nosotros chacha 20) pasas la clave por asimetrico (RSA, ECDHE) y luego cifras con la clave que pasaste cambiando el IV...

que te asegura esto?
si pasas todo asimetrico cifrando byte a byte no solo consumirás mucho procesador, sino que estás pasando una pista de la clave una vez por byte... eventualmente será vulnerable... (la petición http se repite una y otra vez y es la misma XD solo tienes que hacer una conversión lineal, ya sabes cuales simbolos representan la "h", la "t", la "p" entre otros que se repiten XD)
si es simetrico, pasas todo por un cifrado de stream preparado para no ser predecible (aqui entra el iv que "cambia" la contraseña cada vey listo para ser de descifrado rapido

si, el cifrado pasa la contraseña, pero así funciona :o

fijate el post de cifrado rsa en python, puedes meter los bytes que quieras en el mensaje y siempre serás los mismos

pero en aes (si está bien implementado)
tengo estos 3 mensajes, clave 123
K7xGlZ3okW+uE4jiqTt0jE4FGkSwRRUKC9maBAHdsXl8A8+7bZVX/mp85Rmkf2EV
vmd1WLXCAEI1YMaAWvtQsyf6/1Bsiuw5cYTo8jedjGNOW0hgmsvjbcELP/jjBE1S
2zybZUeUJZ8cdGncA+1VczXAJUw7nx4WN3YQcW6BV+SxmSy9K802ATQBJXtSYkE6
y las 3 son el mismo mensaje
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.

AlbertoBSD

Cita de: engel lex en  7 Abril 2016, 02:10 AM
pasas la clave por asimetrico (RSA, ECDHE)

Tu mismo lo dices pasas la "clave" por asimetrico y ya una vez descifrada con tu clave privada pasas a descifrar lo que pasastes por AES256 o por chacha20 o el algoritmo que acordaran

Cita de: engel lex en  7 Abril 2016, 02:10 AM

tengo estos 3 mensajes, clave 123
K7xGlZ3okW+uE4jiqTt0jE4FGkSwRRUKC9maBAHdsXl8A8+7bZVX/mp85Rmkf2EV
vmd1WLXCAEI1YMaAWvtQsyf6/1Bsiuw5cYTo8jedjGNOW0hgmsvjbcELP/jjBE1S
2zybZUeUJZ8cdGncA+1VczXAJUw7nx4WN3YQcW6BV+SxmSy9K802ATQBJXtSYkE6
y las 3 son el mismo mensaje

Claro por el IV o por el modo de empleo del del AES o también puede cambiar dependido si es modo CFB, CBC etc..

En lo que tenga un chance publicare un ejemplo en C.


Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

engel lex

ahh! es que todo pasa en claro? yo estoy asumiendo que el Message Key pasa por asimetrico! :s
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.

AlbertoBSD

Cita de: engel lex en  7 Abril 2016, 05:44 AM
ahh! es que todo pasa en claro? yo estoy asumiendo que el Message Key pasa por asimetrico! :s

Era mi duda, yo asumo que pasa por asimetro al igual que tu y con las claves publicas Curve25519 lo decifran. En la lectura no lo especifican, me imagino que lo dan por hecho.

Bueno ya que nos quitamos la duda teóricamente todo esta bien.

Acabo de hacer un programa en C usando libgcrypt para ejemplicar esto.

El programa hace lo siguiente.

  • Crea un archivo llamada AAAA.txt de 512 bytes lleno de AAAAAAAAAA's para ejempliciar el plain text.
  • Genera un par de llaves RSA (Parte tardada)
  • Guarda las claves creadas en archivo en archivo para su posterior uso
  • Genera apartir de la llave publica y algunos otros datos 5  "Key Message" para fines didacticos solo usaremos el ultimo
  • usa el campo pass del KeyMessage para cifrar el AES en modo CBC con el iv correspondiente
  • Guarda la salida en un archivo llamada AAES.txt

Todavia no me queda muy claro como utilizar HMAC pero leyendo la API y los RFC correspondientes aprendere.

Muestro la salida y al final el codigo del programa que la produce.

Archivo >>>>>>>>AAES <<<<<<<<<<<de salida


Key df9701195198737faf7c163298704e2c5b583532cf8fc20595c8512b5b65e8db2ef1683d4e7399132d719a38cdf14b32d100a73e84f338ae4d8c43dc43c408222e2278d005332bca737d55b5a7a24897
Key b858d2f07d002deeb2afd730078b8f38904725e37f98d31dd15c11a404e22777c1813ea5982db9324e9fc8f85b60720fa709f62baaab81034f9090cf4ad37609858b5d5c7b285f8f0baf241fcd405c28
Key 4df7986bfb598832b552860e7e03bb67a661c75d6a571656ac6b5e31ea60755f984964eafaf78e79e83a66589c2993dd7fc67de37467c6c3e56a565e8167305271079d6902c6cbfdd7ee8c3799d58b79
Key a8d81e45dfcec1e6cb5b9be014626311f42c38f88ceb6f4ef6494d4c7281c92c0e92cdc6cb296231322909b8634af89b15807235b7fcd27c7103e4df89e6163cf809a342ce4004145e3d7f19643d2133
Key 420341bb215e4393c4fb364ed05331bb4ab51e81355d767fe7ac4fe33012c15fcc66740840cc8b0981a9d6e98b925f408e9c16e0b559993b368fb749f337bae3dfe9797fdced844f1d227dbce12bda05




Algunas funciones del programa fueron implementadas de forma rapida y puede fallar.


/*
twitter: @albertobsd
cc -o ejemplos ejemplos.c `libgcrypt-config --cflags --libs`
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<gcrypt.h>

void libgcrypt_init();
int createRSA_4096(char *prefix,char *bufferPkey);
unsigned char *my_kdf(char *passphrase,size_t passphraselen,unsigned int iterations,size_t keysize);
int encrypt(char *buffer,char *pass,char *iv,int length);



typedef struct str_KeyMessage {
unsigned char pass[32];
unsigned char hmac[32];
unsigned char iv[16];
}*KeyMessage;

int main() {

FILE *archivo = NULL;
char *buffer = NULL;
char *pkey = NULL;
char *digest = NULL;
unsigned char *key = NULL;
int length,i,j;
buffer = calloc(512,1);
if(!buffer) {
printf("calloc\n");
exit(0);
}
memset(buffer,'A',512);
archivo = fopen("AAAA.txt","w");
if(!archivo) {
printf("calloc\n");
exit(0);
}
fwrite(buffer,1,512,archivo);
fclose(archivo);
libgcrypt_init();
pkey = calloc(2048,1);
length = createRSA_4096("UsuarioA",pkey);
j = 0;
while(j < 5) {
key = my_kdf(pkey,length,1024,80);
if(!key) {
printf("my_kdf\n");
exit(0);
}
printf("Key ");
i = 0;
while(i < 80) {
printf("%.2x",key[i]);
i++;
}
printf("\n");
j++;
}
KeyMessage km = (KeyMessage)key;
encrypt(buffer,(char*)km->pass,(char*)km->iv,512);
archivo = fopen("AAES.txt","w");
if(!archivo) {
printf("fopen 2");
exit(0);
}
fwrite(buffer,1,512,archivo);
fclose(archivo);

}

void libgcrypt_init() {
if(!gcry_check_version(GCRYPT_VERSION)) {
fprintf(stderr,"libgrypt version mismatch %s\n",GCRYPT_VERSION);
exit(0);
}
gcry_control(GCRYCTL_SUSPEND_SECMEM_WARN);
gcry_control(GCRYCTL_INIT_SECMEM,1638,0);
gcry_control(GCRYCTL_INITIALIZATION_FINISHED,0);
if(!gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P)) {
fprintf(stderr,"libgrypt has not been initialized\n");
exit(0);
}
}

int createRSA_4096(char *prefix,char *publickey) {
FILE *p;
FILE *s;
gcry_sexp_t rsa_parms = NULL;
gcry_sexp_t rsa_keypair = NULL;
gcry_sexp_t rsa_skey = NULL;
gcry_sexp_t rsa_pkey = NULL;
gcry_error_t err = 0;
int temp = 0;
char *nombre_p,*nombre_s;
size_t length = 2048;
size_t offset = 0;
char *bufferkey;
nombre_p = calloc(strlen(prefix) + 2,sizeof(char));
nombre_s = calloc(strlen(prefix) + 2,sizeof(char));
sprintf(nombre_p,"%sp",prefix);
sprintf(nombre_s,"%ss",prefix);
err = gcry_sexp_build(&rsa_parms, NULL, "(genkey (rsa (nbits 4:4096)(rsa-use-e 1:1)))");
if(err) {
fprintf(stderr,"gcry_sexp_build: failed to build\n");
fclose(stderr);
exit(0);
}
err = gcry_pk_genkey(&rsa_keypair, rsa_parms);
gcry_sexp_release(rsa_parms);
if(err) {
fprintf(stderr,"gcry_pk_genkey: failed to genkey\n");
fclose(stderr);
exit(0);
}
rsa_pkey = gcry_sexp_find_token(rsa_keypair, "public-key", 0);
rsa_skey = gcry_sexp_find_token(rsa_keypair, "private-key", 0);
gcry_sexp_release(rsa_keypair);
bufferkey = calloc(length,sizeof(char));
if(bufferkey == NULL) {
fprintf(stderr,"unable to alloc memory\n");
fclose(stderr);
exit(0);
}
offset = gcry_sexp_sprint(rsa_pkey,GCRYSEXP_FMT_CANON,bufferkey,length);
gcry_sexp_release(rsa_pkey);
p = fopen(nombre_p,"w");
if(p == NULL) {
fprintf(stderr,"unable to create file\n");
fclose(stderr);
exit(0);
}
temp = offset;
memcpy(publickey,bufferkey,offset);
fwrite(bufferkey,sizeof(char),offset,p);
fclose(p);
memset(bufferkey,0,length);
offset = gcry_sexp_sprint(rsa_skey,GCRYSEXP_FMT_CANON,bufferkey,length);
gcry_sexp_release(rsa_skey);
s = fopen(nombre_s,"w");
if(s == NULL) {
fprintf(stderr,"unable to create file\n");
fclose(stderr);
exit(0);
}
fwrite(bufferkey,sizeof(char),offset,s);
fclose(s);
memset(bufferkey,0,length);
return temp;
}

unsigned char *my_kdf(char *passphrase,size_t passphraselen,unsigned int iterations,size_t keysize) {
gpg_error_t err;
unsigned char *bufferkey = NULL;
char *salt = NULL;
bufferkey = calloc(keysize,1);
salt = calloc(8,1);
gcry_randomize(salt,8,GCRY_VERY_STRONG_RANDOM);
err = gcry_kdf_derive(passphrase,passphraselen,GCRY_KDF_ITERSALTED_S2K,GCRY_MD_SHA512,salt,8,iterations,keysize,bufferkey);
if(err != 0) {
free(bufferkey);
free(salt);
return NULL;
}
else {
free(salt);
return bufferkey;
}
}


int encrypt(char *buffer,char *pass,char *iv,int length) {
gcry_error_t err = 0;
gcry_cipher_hd_t aes_hd;
gcry_cipher_open(&aes_hd, GCRY_CIPHER_AES256,GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_SECURE);
err = gcry_cipher_setkey(aes_hd, pass, 32);
if (err) {
fprintf(stderr,"gcry_cipher_setkey(): could not set cipher key\n");
fclose(stderr);
exit(0);
}
err = gcry_cipher_setiv(aes_hd, iv, 16);
if (err) {
fprintf(stderr,"gcry_cipher_setiv(): could not set cipher initialization vector\n");
fclose(stderr);
exit(0);
}
err = gcry_cipher_encrypt(aes_hd, (unsigned char*) buffer, length, NULL, 0);
if (err) {
fprintf(stderr,"gcry_cipher_encrypt(): unable to encrypt file\n");
fclose(stderr);
exit(0);
}
err = gcry_cipher_reset(aes_hd);
gcry_cipher_close(aes_hd);
return err;
}




Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

cpu2

No me creo nada tiene que tener algun truco, deberas dejaran conexiones cifradas a las masas y ellos no sabran leerlas? Pero quien se cree eso?, ademas sabiendo el alto nivel de paranoia que hay con las agencias que ya todo el mundo conoce.

El que quiera anonimato que busque otra cosa no Whatsapp.

Un saludo.

P.D: Ayer aparecio la noticia en el telediario, me hizo mucha gracia lo que dijeron xD.

AlbertoBSD

Comparte la noticia para nos de gracia tambien a nosotros.

Whatsapp a sido muy criticado por su falta de seguridad, desde aquellos dias que podias ver los mensajes en texto plano entre otras cosas.

whatsapp podria a ver detectado una disminucion de usuarios y se puso las pilas en ese tema.
El caso de FBI vs Apple demostro que las organizaciones gubernamentales no pueden hacer mucho contra un sistema criptografico bien implementado.

Ahora whatapp solo ofrece seguridad mas no anonimato, todavia quien esta hablando con quien..

para anonimato los sistemas no deberian de pedirte un numero que te identifique.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

cpu2

Cita de: AlbertoBSD en  7 Abril 2016, 14:02 PM
El caso de FBI vs Apple demostro que las organizaciones gubernamentales no pueden hacer mucho contra un sistema criptografico bien implementado.

No se yo no pondria la mano en el fuego, y mas con una aplicacion como esta. Este tema se me torna como el de las VPN "privadas" que no guardan direcciones, logs etc...

Deberas creen que si comometen algun delito, y les lleva a ese servicio, la empresa cargara con el lio de la gente? Con esto pasara igual.

No es posible. Y los servicios que no colaboran cierran, lei sobre un caso de mensajeria de correo que lo cerraron por lo mismo pero ahora no recuerdo.


Cita de: AlbertoBSD en  7 Abril 2016, 14:02 PM
.Ahora whatapp solo ofrece seguridad mas no anonimato, todavia quien esta hablando con quien..

para anonimato los sistemas no deberian de pedirte un numero que te identifique.

Con anonimato lo puse en el contexto de "no saber que dice el mensaje" no sobre la direccion de dicha persona, fallo mio.

Un saludo.


P.D: La noticia, tiene que estar es reciente, ya la pondre, pero nada especial el tipico telediario.