Eu projetei um gerador aleatório simples que alterna dois números de maneira caótica, usando um método de multiplicação e módulo. Funciona muito bem para isso.
Se eu fosse usá-lo como um gerador de cifras, seria vulnerável a um ataque de texto simples conhecido, já que um invasor pode fazer engenharia reversa da semente a partir de uma série de números aleatórios de uma maneira computacionalmente eficiente.
Para provar que a cifra está quebrada, localize um par legal de valores iniciais que gerem 7 zeros em uma linha no intervalo [0; 255], usando o mínimo de energia, tempo de CPU etc. etc.
Aqui está o gerador aleatório escrito em JavaScript:
function seed(state1,state2){
//Constants
var mod1=4294967087
var mul1=65539
var mod2=4294965887
var mul2=65537
function random(limit){
//Cycle each state variable 1 step
state1=(state1*mul1)%mod1
state2=(state2*mul2)%mod2
//Return a random variable
return (state1+state2)%limit
}
//Return the random function
return random
}
//Initiate the random generator using 2 integer values,
//they must be in the ranges [1;4294967086] and [1;4294965886]
random=seed(31337,42)
//Write 7 random values in the range [0;255] to screen
for(a=0;a<7;a++){
document.write(random(256)+"<br>")
}
Eu criei uma ferramenta para testar pares de números candidatos, ela pode ser encontrada aqui .
Nos três dias seguintes, nenhum spoiler é permitido , uma resposta deve conter apenas um conjunto de números e, é claro, deve ser um conjunto diferente dos publicados pelos solucionadores anteriores. Posteriormente, você é encorajado a postar código e explicar sua abordagem.
Editar, a quarentena acabou: as
respostas devem conter um conjunto exclusivo de números, explicação e código para documentar o método de solução.
A solução mais elegante vence.
Para constar:
Escrever um programa que pode encontrar uma solução rapidamente é elegante.
Criar um programa que utilize os recursos de uma GPU de maneira eficiente para fazê-lo ainda mais rápido é elegante.
Fazer o trabalho em um pedaço de "material de museu" é elegante.
Encontrar um método de solução viável que possa ser utilizado usando apenas caneta e papel é muito elegante.
Explicar sua solução de maneira instrutiva e facilmente compreensível é elegante.
O uso de computadores múltiplos ou muito caros é deselegante.
fonte
Respostas:
C ++, 44014022/164607120
Ele está em C ++, usa 1 GB de memória e levou cerca de 45 segundos para encontrar esse primeiro par. Vou atualizar o horário assim que encontrar todos.
Código abaixo. Primeiro, ele encontra todos os pares que geram 4 zeros e depois os reduz por tentativa simples (consulte o
check
método). Ele encontra pares que geram 4 zeros, gerando duas matrizes grandes, uma que contém os primeiros 4 bytes de ordem inferior do gerador state1 e a segunda que contém o negativo dos 4 primeiros bytes de ordem inferior do gerador state2. Essas matrizes são então classificadas e pesquisadas por uma correspondência, que corresponde ao gerador geral que gera 4 zeros para iniciar.As matrizes são grandes demais para serem armazenadas na memória; portanto, ele faz o trabalho em lotes dimensionados para caber na memória.
Parece que a execução completa levará aproximadamente 12 horas.
Edit : Melhorado o código, por isso leva apenas 1 hora para obter todas as sementes possíveis. Agora, ele gera as tabelas em 256 arquivos diferentes, um para cada primeiro byte de saída. Podemos então processar cada arquivo de forma independente, para que não tenhamos de regenerar dados.
Editar : Acontece que você pode gerar as 256 subtabelas individualmente, em vez de todas de uma vez, para que não seja necessário nenhum disco. Tempo de execução até ~ 15 minutos usando 256MB.
fonte