Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Guilherme Borracha

Blum-Blum-Shub

Recommended Posts

Eu procurei na internet de várias formas, mas não encontrei nada que me explicasse como fazer um Blum-Blum-Shub, então preciso que alguém resolva ou me diga onde encontrar algo semelhante já resolvido. Abaixo, o exercício em questão.

No algoritmo Blum-Blum-Shub, calcula-se
n = f(s) = (s*s + K) modulo M;
n = Número gerado
s = Semente
K e M são parâmetros constantes

Vamos usar os seguintes valores: M = 7927*9187 = 72825349
K = 178237

A semente inicial será gerada a partir de uma senha fornecida pelo usuário. O método de geração da semente é uma função hashing que digere a senha transformando-a em um número. Para gerar a semente inicial usa-se o segunte algoritmo:

  • Inicializar: semente=0;
  • Para cada letra da senha:
    • semente = semente * 37 + codigo ASCII da letra;
  • semente = semente modulo 72825349


Especificação e detalhamento do algoritmo
O programa (que será chamado de encripta deve receber a senha e o nome do arquivo de entrada na linha de comando:
encripta <senha> <arquivo-de-entrada>

Se faltar o nome do arquivo de entrada, o programa deve pegar dados de entrada do stream padrão stdin. Se faltar também a senha, o programa deve escrever uma mensagem de erro em stderr e terminar.

Os dados de saída devem ser escritos na saída padrão stdout.

Os seguintes procedimentos deverão ser executados:

  • Interpretar a linha de comando, obtendo a senha e o nome do arquivo de entrada. Emitir as mensagens de erro devidas se as informações da linha de comando foren incompletas ou inválidas.
  • Usar a senha para gerar a semente inicial
  • Abrir o arquivo de entrada, verificando se a abertura foi bem sucedida. Em caso de erro o programa deve escrever a mensagem do sistema opracional e desistir.
  • Para cada byte B do aquivo de entrada:
    • Pegar o byte B do arquivo
    • Obter um número aleatório n usando a fórmula:
      n = (s*s + K) % M;
    • Este valor n será usado como a próxima semente s
    • Modificar o byte B transformando-o em Be com a seguinte fórmula:
      Be = B ^ ((n >> 4) & 0xff);
    • Escrever o byte modificado Be na saída padrão stdout
  • Fechar o arquivo de entrada e terminar.

Observe que com redirecionamentos da entrada e da saida se pode armazenar um arquivo encriptado:

encripta senha arquivo.txt > arquivo.enc

Esta linha pega um arquivo chamado arquivo.txt, encripta-o usando a palavra "senha" para gerar a semente da sequência pseudoaleatória e armazena o resultado em arquivo.enc.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu sei, o problema é que saí recentemente de uma cadeira básica de programação e peguei um professor muito ruim. Ou seja, eu não faço a menor ideia de como fazer esse algoritmo e preciso dele resolvido para ter por onde estudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.