Poderia um número verdadeiramente aleatório ser gerados usando pings para endereços IP pseudo-aleatoriamente selecionados?

StackOverflow https://stackoverflow.com/questions/137340

  •  02-07-2019
  •  | 
  •  

Pergunta

A questão colocada surgiu durante a segunda palestra ano Comp ciência ao discutir a impossibilidade de geração de números em um dispositivo computacional determinístico.

Esta foi a única sugestão que não dependem de hardware não-mercadoria-classe.

Posteriormente ninguém iria colocar sua reputação em jogo para argumentar definitivamente a favor ou contra ele.

Qualquer um cuidado para tomar uma posição a favor ou contra. Se sim, como sobre uma menção a uma possível implementação?

Foi útil?

Solução

Não.

Uma máquina malicioso em sua rede pode usar ARP spoofing (ou uma série de outras técnicas) para interceptar seus pings e responder a eles depois de determinados períodos. Eles, então, não só saber o que seus números aleatórios são, mas eles também controlá-los.

É claro, ainda há a questão de como determinista sua rede local é, por isso pode não ser tão fácil como tudo o que na prática. Mas desde que você obter nenhum benefício de ping IPs aleatórias na internet, você poderia muito bem chamar a entropia do tráfego ethernet.

Desenho entropia de dispositivos ligados à sua máquina é um princípio bem estudado e as vantagens e desvantagens de vários tipos de dispositivos e métodos de medição pode ser, por exemplo roubado da implementação de / dev / random.

[ Editar : como princípio geral, quando se trabalha nos fundamentos da segurança (e as únicas necessidades práticas para quantidades significativas de dados verdadeiramente aleatórios são relacionadas à segurança), você deve assumir que um fantasticamente bem -resourced, determinado atacante fará tudo em seu poder para quebrar seu sistema.

Para segurança prático, você pode assumir que ninguém quer sua chave PGP que mal, e se contenta com um trade-off de segurança contra o custo. Mas quando inventando algoritmos e técnicas, você precisa dar-lhes as garantias de segurança mais fortes que eles poderiam sempre possivelmente face. Desde que eu posso acreditar que alguém, em algum lugar, pode querer outra pessoa chave privada mal o suficiente para construir este pedaço de kit para derrotar sua proposta, não posso aceitá-la como um avanço sobre as melhores práticas actuais. AFAIK / dev / random segue bastante próximo com as melhores práticas para a geração de dados verdadeiramente aleatórios em um PC barato casa]

[ Outro edit : ele sugeriu nos comentários que (1) é verdade de qualquer TRNG que o processo físico poderia ser influenciada, e (2) que as preocupações de segurança não se aplicam aqui de qualquer maneira .

A resposta para (1) é que é possível em qualquer hardware real para fazê-lo muito melhor do que os tempos de resposta de ping, e recolher mais entropia mais rápido, que esta proposta é uma não-solução. Em termos CS, obviamente, você não pode gerar números aleatórios em uma máquina determinística, que é o que provocou a pergunta. Mas, em seguida, em termos CS, uma máquina com um fluxo de entrada externa é não-determinista, por definição, por isso, se estamos falando de ping então nós não estamos falando de máquinas deterministas. Por isso, faz sentido olhar para as entradas reais que as máquinas reais têm, e considerá-los como fontes de aleatoriedade. Não importa o que as suas máquinas, tempos de ping matérias não estão no topo da lista de fontes disponíveis, para que possam ser excluída antes de se preocupar com o bem os melhores são. Assumindo que a rede não é subvertida é uma hipótese muito maior (e desnecessário) de assumir que o seu próprio hardware não é subvertida.

A resposta a (2) é filosófico. Se você não se importa seus números aleatórios tendo a propriedade que pode ser escolhido em um capricho em vez de por acaso, então esta proposta é OK. Mas isso não é o que eu entendo pelo termo 'aleatório'. Só porque algo é inconsistente não significa que seja necessariamente aleatória.

Finalmente, para resolver os detalhes da implementação da proposta, conforme solicitado: supondo que você aceitar tempos de ping como aleatório, você ainda não pode usar os tempos de ping não transformados como saída RNG. Você não sabe a sua distribuição de probabilidade, e eles certamente não estão uniformemente distribuídos (que é normalmente o que as pessoas querem de um RNG).

Então, você precisa decidir quantos bits de entropia por pingue você está disposto a confiar. A entropia é uma propriedade matemática precisamente definida de uma variável aleatória que pode razoavelmente ser considerada uma medida de como 'aleatória' que realmente é. Na prática, você encontra um limite inferior você está feliz com. Em seguida, de hash juntamente um número de entradas, e convertê-lo em um número de bits de saída menos do que ou igual ao total baseou-upon entropy das entradas. 'Total' faz soma média não necessariamente: se as entradas são estatisticamente independentes, então é a soma, mas isso é pouco provável que seja o caso de pings, então parte da sua estimativa de entropia será a conta para correlação. A irmã mais velha sofisticado desta operação hash é chamado de 'coletor de entropia', e todos os bons sistemas operacionais têm um.

Se você estiver usando os dados para propagar um PRNG, porém, e o PRNG pode utilizar a entrada de sementes arbitrariamente grande, então você não tem que de hash, porque ele vai fazer isso por você. Você ainda tem que estimar entropia se você quiser saber como 'aleatória' o seu valor de semente foi -. Você pode usar o melhor PRNG no mundo, mas a sua entropia é ainda limitada pela entropia da semente]

Outras dicas

Os números aleatórios são demasiado importante para ser deixado ao acaso.

ou externo influência / manipulação.

Resposta curta

Usando dados de tempo de ping por si só não seria verdadeiramente aleatório, mas ele pode ser usado como uma fonte de entropia que pode então ser usado para gerar dados verdadeiramente aleatórios.

versão mais longa

Como aleatório são tempos de ping?

Por si só, os dados de sincronização das operações de rede (tal como ping) iria não ser uniformemente distribuída. (E a idéia de selecionar os hosts aleatórios não é prático - muitos se não responder a todos, e as diferenças entre os hosts pode ser enorme, com espaços entre intervalos de tempo de resposta - pense conexões via satélite).

No entanto, enquanto o tempo não será bem distribuído, haverá algum nível de aleatoriedade nos dados. Ou, dito de outra forma, um nível de entropia informações está presente. É uma idéia muito bem para alimentar os dados de tempo em um gerador de números aleatórios para semear ele. Então, o nível de entropia está presente?

Para dados de tempo de rede de exemplo em torno de 50ms, medidos com os 0.1ms mais próximas, com um spread de valores de 2ms, você tem cerca de 20 valores. Arredondamento à potência mais próxima de 2 (16 = 2 ^ 4) tiver 4 bits de entropia por valor de tempo. Se é para qualquer tipo de aplicação de segurança (tais como a geração de chaves criptográficas), em seguida, I seria conservador e dizer que foi apenas 2 ou 3 pedaços de entropia por leitura. (Note que eu fiz uma estimativa muito grosseira aqui, e ignorou a possibilidade de ataque).

Como gerar dados verdadeiramente aleatórios

Para os verdadeiros números aleatórios, você precisa enviar os dados em algo projetado ao longo das linhas de / dev / aleatório que irá recolher a entropia, distribuí-lo dentro de um armazenamento de dados (usando algum tipo de função hash , geralmente um seguro um ). Ao mesmo tempo, a estimativa entropia é aumentada. Assim, para uma chave AES de 128 bits, 64 horários de ping seria necessário antes da piscina entropia teve entropia suficiente.

Para ser mais robusto, você pode então adicionar dados de tempo a partir do uso do teclado e do rato, os tempos de resposta do disco rígido, os dados do sensor da placa-mãe (por exemplo, temperatura), etc. Ele aumenta a taxa de coleta de entropia e faz com que seja difícil para um atacante para monitorar todas as fontes de entropia. E de fato isso é o que é feito com sistemas modernos. A lista completa de fontes de entropia MS Windows está listada na segundo comentário deste post .

Mais leitura

Para a discussão da (segurança informática) ataques em geradores de números aleatórios, e o projeto de um gerador de números aleatórios criptograficamente segura, você poderia fazer pior do que ler a yarrow papel por Bruce Schneier e John Kelsey. (Yarrow é usada por sistemas BSD e Mac OS X).

Não.

Desligue o cabo de rede (ou /etc/init.d/networking stop) e a entropia basicamente cai para zero.

Execute um ataque Denial-of-Service na máquina é o ping e você também obter resultados previsíveis (o valor ping-timeout)

Eu acho que você podia. Um par de coisas que atente para:

  • Mesmo se o ping endereços IP aleatórios, os primeiros saltos (de você para o primeiro roteador verdadeira L3 na rede ISP) será o mesmo para cada pacote. Isto coloca um limite inferior no tempo de ida e volta, mesmo se você pingue algo em um datacenter em que o primeiro Ponto de Presença. Então você tem que ter cuidado com a normalizar o momento, não há um limite inferior na ida e volta.
  • Você também tem que ter cuidado com a modelagem de tráfego na rede. Uma implementação típica de balde furado em um router liberta N bytes cada microssegundos M, que perturba de forma eficaz a sua temporização em intervalos de tempo específicos, em vez de uma faixa contínua de vezes. Então você pode precisar descartar os bits de baixa ordem do seu timestamp.

No entanto, eu não concordar com a premissa de que não são boas fontes de entropia em hardware commodity. Muitos chipsets X86 para os últimos anos incluíram geradores de números aleatórios. O que eu estou familiarizado com uso ADCs relativamente sensíveis para medir a temperatura em dois locais diferentes no dado, e subtrair-los. Os bits de baixa ordem de este diferencial de temperatura pode ser demonstrado (através de análise de Qui-quadrado) a ser fortemente aleatória. À medida que aumenta a carga de processamento no sistema a temperatura global sobe, mas o diferencial entre duas áreas da matriz permanece não correlacionadas e imprevisível.

A melhor fonte de aleatoriedade em hardware commodity que eu vi, era um cara que removeu um filtro ou algo de sua webcam, colocar cola opaca na lente, e foi então capaz de detectar facilmente pixels brancos individuais de raios cósmicos impressionantes o CCD. Estes são tão perto perfeitamente aleatório quanto possível, e estão protegidos contra espionagem externa por efeitos quânticos.

Parte de um bom gerador de números aleatórios é probabilidades iguais de todos os números como n -.> Infinidade

Então, se você está planejando para gerar bytes aleatórios, então com dados suficientes de um bom RNG, cada byte deve ter uma probabilidade igual de ser devolvidos. Além disso, não deve haver nenhum padrão ou predictibiltiy (picos de probabilidade durante certos períodos de tempo) de determinados números a ser devolvida.

Eu não estou muito certo com o uso de ping que você estaria medição para obter a variável aleatória, é o tempo de resposta? Se assim for, você pode ter certeza que alguns tempos de resposta, ou intervalos de tempos de resposta, será mais frequente do que outros e, portanto, faria um gerador de números aleatórios, potencialmente inseguro.

Se você quiser hardware commodity, sua placa de som deve praticamente fazê-lo. Apenas aumentar o volume de uma entrada analógica e você tem uma fonte de ruído branco barato. aleatoriedade barato sem a necessidade de uma rede.

A abordagem da medir algo para gerar uma semente aleatória parece ser um muito bom. O livro O'Reilly Unix Prático e Internet Security dá uma alguns métodos adicionais semelhantes de determinação de uma origem aleatória, tais como pedir ao utilizador para escrever algumas teclas, e depois medindo o tempo entre batidas de tecla. (As notas do livro que esta técnica é usada por PGP como fonte de sua aleatoriedade.)

Gostaria de saber se a temperatura atual da CPU do sistema (medido a muitas casas decimais) poderia ser um elemento vital de uma semente aleatória. Esta abordagem teria a vantagem de não necessitar de acesso à rede (para o gerador aleatório não se tornaria disponível quando a conexão de rede vai para baixo).

No entanto, provavelmente não é provável que o sensor interno de uma CPU poderia medir com precisão a temperatura da CPU para suficientes casas decimais para fazer o valor realmente viável como uma semente de números aleatórios; pelo menos, não com "hardware commodity-class", como mencionado na pergunta!

Não é tão bom como o uso de ruído atmosférico, mas ainda é verdadeiramente aleatório, uma vez que depende das características da rede que é notório para o comportamento não-repetível aleatório.

Consulte Random.org para saber mais sobre aleatoriedade.

Aqui está uma tentativa de implementação:

@ips  : list = getIpAddresses();
@rnd         = PseudorandomNumberGenerator(0 to (ips.count - 1));

@getTrueRandomNumber() { ping(ips[rnd.nextNumber()]).averageTime }

Eu prefiro usar algo como ISAAC como um PRNG mais forte antes de confiar ida e volta sibilos como entropia. Como já foi dito, que seria apenas demasiado fácil para alguém, não só acho que os seus números, mas também possivelmente controlá-los para vários graus.

Outras grandes fontes de existir entropia, que os outros. Um que não foi mencionado (que pode não ser prático) é a amostragem de ruído do dispositivo de áudio a bordo .. que é geralmente vai ser um pouco barulhento, mesmo se nenhum microfone está conectado a ele.

Eu fui 9 rodadas com a tentativa de chegar a um PRNG forte (e rápido) para um mecanismo RPC cliente / servidor que eu estava escrevendo. Ambos os lados tinha uma chave idênticos, consistindo de 1024 linhas de 32 caracteres cifras. O cliente iria enviar AUTH xx, o servidor retornaria AUTH aa .. e ambos os lados sabiam que duas linhas da chave para usar para produzir o segredo blowfish (+ sal). Servidor, então, enviar um SHA-256 digerir da chave inteira (criptografada), o cliente sabia que estava falando com algo que tinha a chave correta .. sessão continuou. Sim, proteção muito fraca para o homem no meio, mas uma chave pública estava fora de questão para a forma como o dispositivo estava sendo utilizado.

Então, você tinha um servidor não bloqueio que teve de lidar com até 256 conexões .. não só o PRNG tem que ser forte, tinha que ser rápido. Não era um tal dificuldade de usar métodos mais lentas para reunir entropia no cliente, mas que não poderia ser oferecida no servidor.

Então, eu tenho que perguntar sobre a sua ideia .. como prática seria?

No cômputo mathmatical pode produzir um resultado aleatório, mas nos computadores "mundo real" não exatamente apenas crunch números ... Com um pouco de criatividade, deve ser possível para produzir resultados aleatórios do tipo onde não existe método conhecido de reproduzir ou previsão exata resultados.

Um dos mais fáceis de implementar idéias que eu vi que funciona universalmente em todos os sistemas é usar estática da linha de cartão de computadores som in / porta MIC.

Outras idéias incluem ruído térmico e baixo tempo nível de linhas de cache. Muitos PCs modernos com chips TPM tem criptografia de hardware de qualidade geradores de números aleatórios já a bordo.

A minha reação automática de Ping (esp se estiver usando ICMP) é que a sua batota também blatently. Nesse ponto você pode também sacar um contador de Giger e utilização radiação de fundo como sua fonte aleatória.

Sim, é possível, mas ... o diabo está nos detalhes.

Se você estiver indo para gerar um inteiro de 32 bits, você precisa reunir> 32 bits de entropia (e usar uma função de mistura suficiente para obter essa propagação entropia ao redor, mas isso é conhecido e factível). A grande questão que é a seguinte:

quanto entropia que tempos de ping tem?

A resposta a esta pergunta depende de todos os tipos de suposições sobre a rede e seu modelo de ataque, e não há respostas diferentes em diferentes circunstâncias.

Se os atacantes são capazes de controlar totalmente os tempos de ping, você obter 0 bits de entropia por Ping, e você não pode nunca totais 32-bits de entropia, não importa o quanto você misturar. Se eles têm menos do que perfeito controle sobre tempos de ping, você vai ter alguma entropia, e (se você não superestimar a quantidade de entropia que você está reunião) terá números de 32 bits perfeitamente aleatórios.

YouTube mostra um dispositivo em ação: http://www.youtube.com/watch? v = 7n8LNxGbZbs

Aleatório é, se ninguém pode prever o próximo estado.

Embora eu não posso definitivamente local a favor ou contra, esta implementação tem seus problemas.

Onde estão esses endereços IP provenientes de, se eles são selecionados aleatoriamente, o que acontece quando eles não responder ou estiver atrasado em responder, isso significa que o número aleatório será mais lenta a aparecer.

Além disso, mesmo se você faria um gráfico visual de 100.000 resultados e calcularam que não existem ou poucas correlações entre os números, não significa que ele é verdadeiramente aleatório. Como explicado por dilbert :)

Não me parece uma boa fonte de aleatoriedade.

O que métrica você usaria - o óbvio é o tempo de resposta, mas o intervalo de valores que você pode razoavelmente esperar é pequeno: algumas dezenas de milissegundos a alguns milhares. Os tempos de resposta-se seguirá uma curva de sino e não ser distribuída aleatoriamente em qualquer intervalo (como você escolher o intervalo?) Assim que você tem que tentar e selecionar alguns pedaços 'aleatória' a partir dos números.

O LSB pode dar-lhe um fluxo de bits aleatórios, mas você teria que considerar as questões de relógio de granularidade -. Talvez devido à forma como as interrupções trabalhar você sempre obter múltiplos de 2ms em alguns sistemas

Há provavelmente muito melhor maneiras 'interessantes' de conseguir bits aleatórios - Talvez o Google por uma palavra aleatória, agarra a primeira página e escolher o Nth mordeu a partir da página

.

Eh, eu acho que esse tipo de pergunta leva em discussões sobre o significado de 'verdadeiramente aleatório' muito rapidamente.

Eu acho que a medição pings renderia bits aleatórios decente de qualidade, mas a um ritmo insuficiente para ser de muito uso (a menos que estavam dispostos a fazer alguma DDOSing sério).

E eu não vejo que seria mais aleatória do que medir analógicos propriedades / mecânicas do computador, ou o comportamento do meatbag utilizá-lo.

(edit) Em uma nota prática, esta abordagem lhe abre para a possibilidade de alguém em sua rede manipulando seu gerador de números 'aleatória'.

Parece-me que a verdadeira aleatoriedade é inefável - não há nenhuma maneira de saber se uma sequência é aleatória, já que, por definição, ele pode conter qualquer não importa o quão improvável. Garantindo um padrão de distribuição particular, reduz a aleatoriedade. A palavra "padrão" é um pouco de um sorteio.

    I MADE U A RANDOM NUMBER
           BUT I EATED IT

A aleatoriedade não é uma propriedade binária - é um valor entre 0 e 1, que descreve como é difícil prever o próximo valor em um fluxo

.

Perguntar "como aleatório pode meus valores se eu baseá-las nos pings?" está realmente pedindo "como aleatório são pings?". É possível estimar que através da recolha de um grande conjunto de dados suficiente (1 sibilos mln por exemplo) e o mapeamento sua curva de distribuição e comportamento no tempo. Se a distribuição é plana e o comportamento é difícil de prever, os dados parecem mais aleatória. A distribuição mais acidentado ou comportamento previsível sugerem aleatoriedade inferior.

Você também deve considerar a resolução da amostra. Eu poderia imaginar os resultados que estão sendo arredondado de alguma forma para um milisegundo, assim com pings você poderia ter inteiro valores entre 0 e 500. Isso não é um monte de resolução.

No lado prático, eu recomendaria contra ele, já que pings pode ser prevista e manipulada, reduzindo ainda mais a sua aleatoriedade.

Geralmente, eu sugiro contra a "rolar seus próprios" geradores de aleatoriedade, métodos de criptografia e algoritmos de hash. Tão divertido quanto parece, é principalmente um monte de matemática muito intimidante.

Como a como construir um bom gerador de entropia - Eu acho que provavelmente vai ter que ser uma caixa selada que as saídas algum tipo de resultado de interações em nível atômico ou subatômico. Quer dizer, se você estiver usando uma fonte de entropia que o inimigo pode ler facilmente também, ele só precisa descobrir o seu algorythm. Qualquer forma de conexão é um possível vetor de ataque, então você deve colocar a fonte de entropia mais próximo possível do serviço que consome quanto possível.

Você pode usar o método XKCD:

Random Number Generator

Eu tenho algum código que cria números aleatórios com traceroute. Eu também tenho um programa que faz isso usando ping. Eu fiz isso mais de um ano atrás para um projeto de classe. Tudo que faz é traceroute run on e endereço e leva a menos dígitos sig dos tempos ms. Ele funciona muito bem no sentido de conseguir números aleatórios, mas eu realmente não sei o quão próximo está a verdadeira aleatória.

Aqui está uma lista de 8 números que eu tenho quando eu corri.

455298558263758292242406192

506117668905625112192115962

805206848215780261837105742

095116658289968138760389050

465024754117025737211084163

995116659108459780006127281

814216734206691405380713492

124216749135482109975241865

#include <iostream>
#include <string>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <vector>
#include <fstream>

using namespace std;

int main()
{
system("traceroute -w 5 www.google.com >> trace.txt");

string fname = "trace.txt";
ifstream in;
string temp;

vector<string> tracer;
vector<string> numbers;

in.open(fname.c_str());
while(in>>temp)
tracer.push_back(temp);

system("rm trace.txt");

unsigned index = 0;

string a = "ms";
while(index<tracer.size())
{
if(tracer[index]== a)
numbers.push_back(tracer[index-1]);
++index;
}


std::string rand;

for(unsigned i = 0 ; i < numbers.size() ; ++i)
{
std::string temp = numbers[i];
int index = temp.size();
rand += temp[index - 1];
}

cout<<rand<<endl;

return 0;

}

Muito simplesmente, desde redes de obedecer as regras prescritas, os resultados não são aleatórios.

Os sons ideia webcam (ligeiramente) razoável. pessoas Linux geralmente recomendam simplesmente usando o ruído aleatório de uma placa de som que não tem microfone ligado.

aqui é a minha sugestão:

1- Escolher um soco de sites que estão tão longe de sua localização possível. por exemplo. se você está em US tentar alguns sites que têm seus IPs de servidores na Malásia, China, Rússia, Índia .etc. servidores com alto tráfego são melhores.

2 durante os períodos de alto tráfego de internet no seu país (no meu país é como 7 às 11 horas) o ping esses sites muitas muitas muitas vezes, tomar cada resultado do ping (use somente o valor inteiro) e calcular o módulo 2 de -lo (ou seja, de cada operação de ping você começa um pouco: 0 ou 1).

3 repita o processo por vários dias, registrando os resultados.

4 recolher todos os bits que você tem de todos os seus pings (provavelmente você vai ter centenas de milhares de bits) e escolher entre eles seus bits. (Talvez você quer escolher seus bits usando alguns dados a partir do mesmo método mencionado acima :))

Tenha cuidado: em seu código que você deve verificar se há tempo limite .etc

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top