- Ana Raquel Neves Vidal
- Simão Augusto Ferreira Andrade
- C;
- Java;
- Implementar um gerador de bytes pseudo-aleatórios, com uma seed com N bytes. A inicialização deste gerador será importante para contribuir para a geração do par de chaves RSA;
- Implementar um gerador de chaves RSA, que gere um par de chaves (pública e privada) com base num número primo de N bits, e que guarde as chaves em ficheiros de texto;
- Testar a performance do gerador de bytes pseudo-aleatórios, em termos de tempo de execução.
Criação de um PRBG (Pseudo-Random Bit Generator) que irá gerar um conjunto de bytes pseudo-aleatórios.
- Palavra-passe;
- Confusion string;
- Contador de iterações;
- Computar uma seed para a palavra-passe, a confusion string e o contador de iterações, usando o método PBKDF2;
- Computar uma confusion pattern, neste caso vamos usar o mesmo método que foi usado para computar a seed, pois a confusion string é dada no algortimo PBKDF2 como o salt;
- Inicializar o gerador com a seed;
- Começar um ciclo com 'contador de iterações' iterações;
- Usar o PRNG para gerar um conjunto de bytes pseudo-aleatórios, até que o padrão da confusion pattern seja encontrado;
- Usar o PRNG para produzir a nova seed e usar essa seed para gerar os bytes pseudo-aleatórios.
Para o PRNG utilizado foi o SHA-256, onde é dada uma seed e é gerado o hash dessa seed, a cada iteração é gerado um novo hash usando o hash anterior como seed.
O par de chaves RSA será gerado através do gerador de bytes pseudo-aleatórios, da seguinte forma:
- Gerar um conjunto de bytes pseudo-aleatórios com o tamanho da chave RSA (em bytes);
- Será dividido o conjunto de bytes em dois conjuntos de bytes, sendo que o primeiro conjunto irá representar o nosso p e o segundo conjunto irá representar o nosso q, ambos em formato BIGNUMBER/BigInteger;
- Será verificado se os dois conjuntos de bytes são primos, caso não sejam, o seu valor será incrementado até que sejam primos;
- Será calculado o valor de n através da multiplicação
p * q; - O valor de e é fixo, sendo que o seu valor é 65537 (2^16 + 1);
- Será calculado o valor de d através da função modular inverse de e e phi(n), sendo que phi(n) é calculado através da multiplicação
(p-1) * (q-1);
Será guardado o par de chaves RSA em dois ficheiros de texto, sendo que um deles irá conter a chave pública (n,e) e o outro irá conter a chave privada (n,d).
Para armazenar ambas as chaves foi usado o padrão DER (Distinguished Encoding Rules), sendo que o padrão DER é um formato binário que é codificado em base64 para ser guardado no ficheiro PEM.
Este padrão tem a seguinte estrutura:
- Byte de Início de Sequência (
0x30): Indica o início de uma sequência de DER. - Tamanho Total da Sequência: O tamanho da sequência que inclui N e E.
- Byte de Separação para N (
0x02): Indica o início de um número inteiro. - Tamanho do N: O tamanho do módulo N.
- N (Modulus): Os bytes que representam o módulo.
- Byte de Separação para E (
0x02): Indica o início de outro número inteiro. - Tamanho do E: O tamanho do expoente público E.
- E (Public Exponent): Os bytes que representam o expoente público.
Para criar/atualizar a documentação do programa, basta executar o seguinte comando:
simao@root$ doxygen DoxyfilePara compilar o programa em C, basta executar o makefile, através do comando make, e será criado um executável chamado randgen, outro chamado rsagen e outro chamado performance.
Para executar o programa randgen basta executar o seguinte comando:
simao@root$ ./randgen <password> <confusion string> <iterations>Nota: Sendo que o resultado será retornado para o stdout.
Para executar o programa rsagen basta executar o seguinte comando:
simao@root$ ./rsagenPara executar o programa performance basta executar o seguinte comando:
simao@root$ ./performanceNota: Sendo que a entrada do programa será feita através do stdin.
De modo a executar ambos utilizando o pipe, basta executar o seguinte comando:
simao@root$ ./randgen <password> <confusion string> <iterations> | ./rsagenPara compilar o programa em Java, basta executar o seguinte comando:
ana@root$ javac *.javaPara executar o programa randgen basta executar o seguinte comando:
ana@root$ java randgen <password> <confusion string> <iterations>Nota: Sendo que o resultado será retornado para o stdout.
Para executar o programa jrsagen basta executar o seguinte comando:
ana@root$ java jrsagenNota: Sendo que a entrada do programa será feita através do stdin.
De modo a executar ambos utilizando o pipe, basta executar o seguinte comando:
ana@root$ java jrandgen <password> <confusion string> <iterations> | java rsagenDevido á grande computação que é feita pela aplicação randgen, apenas foi testado a performance do setup do gerador de bytes pseudo-aleatórios.
Por fazer...
Por fazer...