Mais um blog inútil.

Abril 27, 2008

Amadores

Filed under: Coding,Drama,Fail,Useless — dongs @ 1:10

O FiSH é uma valente seca para se compilar - é um facto. Em particular quando se fala em compilá-lo num SO opensores numa arquitectura não x86. A biblioteca MIRACL que aquilo usa é essencialmente o problema aqui. Portanto a escolha lógica é acabar com esta biblioteca e usar uma ligeiramente mais decente.

Agora, a biblioteca em si não é nada má. Para fins criptográficos provê montes de coisas úteis que seriam feitas à mão de outro modo -- números aleatórios seguros, curvas elípticas (e construção de boas curvas - poucas bibliotecas são minimamente úteis neste aspecto), além de possuir hashing (SHA-2) e encriptação (AES) incorporados. No entanto, o processo de compilação é absolutamente deixado ao acaso e a documentação é como deixar o Bear Grylls no deserto sem um hotel por perto.

Obviamente eu não fui o primeiro a ter esta ideia. Nos próprios fórums já foi sugerido múltiplas vezes esta mudança, e aparentemente alguém já a fez. Mas vamos lá olhar para este patch com olhos de ver:

int DH1080_gen(char *priv_key, char *pub_key)
{
.....

+ mpz_t mpz_privkey, mpz_prime, mpz_pubkey, mpz_base;
+ gmp_randstate_t randstate;
// #*#*#*#*#* RNG START #*#*#*#*#*
time((time_t *)&seed);
+ gmp_randinit_default(randstate);
+ gmp_randseed_ui(randstate, seed);
+ mpz_urandomb(mpz_privkey, randstate, 1080);
+ gmp_randclear(randstate);
seed=0;
// #*#*#*#*#* RNG END #*#*#*#*#*
....

}

Aparentemente o nosso génio, além de utilizar a função errada (deveria ser mpz_urandomm) para gerar números entre 0 e mpz_prime exclusive (mpz_prime sendo o primo que define o grupo onde estamos a trabalhar e por sua vez define a dificuldade do problema no caso de uma implementação em condições), não verifica se a chave pública criada é 0 ou 1 (o que arruinaria ligeiramente a segurança nesse caso estupidamente remoto). Mas aqui a maior falha é utilizar a data do sistema como seed para a chave privada. Sim, todas as chaves possíveis criadas com este patch estão dependentes de um valor de 32 bits (que na prática pode ser reduzido muito mais -- é um timestamp). Parece-me que alguém não faz ideia do que está a fazer (aparentemente uma situação generalizada na indústria da segurança, diga-se de passagem).

Mas enfim, não se pode apenas criticar. Com o intuito de parecer ligeiramente menos hipócrita, coloco aqui a minha própria modificação que utiliza um método ligeiramente mais seguro para a geração de chaves (no código original, era criado e seedado um novo csprng por cada troca -- qual a necessidade?). Utilizo a cifra ISAAC para a geração de números aleatórios (não se pode ser muito mais judeu que isto, eh?), e esta é alimentada com 256 bytes do /dev/urandom (caso queiram portar para Windows podem facilmente utilizar a RtlGenRandom) misturados com a SHA-256 do blow.ini e do irssi.conf. É então gerado um número e certificamo-nos que este se encontra no intervalo [2; prime1080-1].

Para a aritmética uso a GMP. Alterei apenas o plugin para irssi, mas quaisquer alterações são facilmente movidas para as outras versões. Deixo o licenciamento para quem não tem mais nada em que pensar.

Download

Nota: Se estiverem a usar Ubuntu e não conseguirem compilar, a culpa não é minha.

Nota2: Se são verdadeiramente paranóicos, estão a utilizar a ferramenta errada. A troca de chaves como é implementada no FiSH (puro Diffie-Hellman) é vulnerável a ataques man-in-the-middle, uma vez que não existe qualquer autenticação; se querem algo minimamente seguro, talvez o SILC não seja um mau começo.

4 comentários a “Amadores”

  1. xarutux diz:

    pah q fish...

    :P

  2. xarutux diz:

    Eras um grande homem, era se fizesses o fish para pocketIRC...
    :)
    Os fadinhos FAGS amavam-te para a eternidade

  3. Dongs_FANBoy diz:

    Faz-me um filho pah.

  4. falso diz:

    Para compilar num ubuntu novo tive de trocar o glib-config por pkg-config glib-2.0 na makefile para compilar

Leave a Reply for xarutux

widgeon
widgeon
widgeon
widgeon