문제

좋아, 나는 이것이 전적으로 주관적이고 무엇이 아닌지 생각하지만, 나는 무작위 숫자 생성기의 엔트로피 소스에 대해 생각하고 있었다. 대부분의 발전기가 현재 시간으로 시드링되는 것이 좋습니다. 맞습니까? 글쎄, 나는 다른 소스가 완벽하게 유효한 무작위 (느슨한 정의) 숫자를 생성하는 데 어떤 다른 소스가 사용될 수 있는지 궁금했습니다.

여러 소스 (예 : Time + Current HDD Seek Time [우리는 환상적입니다])를 함께 사용하여 단일 소스보다 "더 임의의"숫자를 만들까요? 소스의 양의 논리적 한계는 무엇입니까? 얼마나 충분한가요? 편리하기 때문에 단순히 선택된 시간입니까?

이런 종류의 일이 허용되지 않으면 실례합니다. 그러나 나는 그 출처의 이론에 대해 궁금합니다.

도움이 되었습니까?

해결책

위키 백과 기사 하드웨어 임의 번호 생성기 물리적 특성을 사용하여 랜덤 숫자에 대한 몇 가지 흥미로운 소스를 나열합니다.

내가 좋아하는 것들:

  • PC에 부착 된 가이거 카운터에 의해 감지 된 핵 붕괴 방사선 소스.
  • 반투명 거울을 통해 이동하는 광자. 상호 배타적 이벤트 (반사 - 전송)는 각각 "0"또는 "1"비트 값과 관련이 있습니다.
  • 저항으로부터의 열 노이즈는 증폭되어 임의의 전압 소스를 제공합니다.
  • 눈사태 다이오드에서 생성 된 눈사태 소음. (얼마나 멋진가요?)
  • PC에 부착 된 무선 수신기에 의해 감지 된 대기 소음

그만큼 문제 섹션 Wikipedia 기사의 기사는 이러한 소스/센서의 많은 취약성을 설명합니다. 센서는 나이/저하로 인해 거의 항상 무작위로 무작위로 생성됩니다. 이러한 물리적 소스는 생성 된 데이터를 분석 할 수있는 통계 테스트로 지속적으로 점검해야하며, 기기가 조용히 깨지지 않도록합니다.

다른 팁

SGI는 한때 엔트로피 소스로 다양한 "글로벌 상"에서 용암 램프의 사진을 사용했는데 결국 오픈 소스 랜덤 번호 생성기로 진화했습니다. lavarnd.

나는 사용한다 random.org, 그들은 대기 노이즈로부터 무료 임의의 데이터를 제공하며, 나는 Mersene-Twister RNG를 정기적으로 다시 묻는 데 사용합니다. 하드웨어 종속성없이 얻을 수있는 것만 큼 무작위로.

임의의 숫자 생성기를위한 "좋은"시드에 대해 걱정하지 마십시오. 시퀀스의 통계적 특성은 발전기의 시드에 의존하지 않습니다. 그러나 다른 것들이 있습니다. 에 대해서 걱정하다. 보다 무작위 숫자 생성의 함정.

하드웨어 임의 번호 생성기의 경우 이러한 물리적 소스를 측정해야하며 측정 프로세스에는 체계적인 오류가 있습니다. "Pseudo"랜덤 숫자가 "실제"랜덤 숫자보다 품질이 더 높다는 것을 알 수 있습니다.

Linux 커널은 장치 인터럽트 타이밍 (마우스, 키보드, 하드 드라이브)을 사용하여 엔트로피를 생성합니다. 좋은 것이 있습니다 기사 엔트로피의 위키 백과에.

현대 RNG는 근처의 씨앗의 상관 관계에 대해 확인하고 파종 후 수백 개의 반복을 실행합니다. 따라서 불행히도 지루하지만 진정한 대답은 실제로 중요하지 않다는 것입니다.

일반적으로, 무작위 물리적 프로세스를 사용하는 것은 균일 한 분포를 준수하고 그렇지 않으면 손상이 있는지 확인해야합니다.

제 생각에는 매우 잘 이해 된 의사 랜덤 번호 생성기를 사용하는 것이 종종 낫습니다.

사용자 마우스 움직임을 사용하여 임의의 숫자를 생성하는 암호화 프로그램을 사용했습니다. 유일한 문제는 프로그램이 잠시 멈추고 사용자에게 마우스를 몇 초 동안 무작위로 무작위로 움직여 제대로 작동하지 않아야한다는 것입니다.

나는 찾았다 핫 브릿 몇 년 전 - 숫자는 진정으로 방사성 붕괴로 생성됩니다. 무작위의 번호.

하루에 다운로드 할 수있는 숫자 수에는 제한이 있지만 RNG의 실제 임의의 씨앗으로 사용하는 것은 항상 즐거워했습니다.

일부 TPM (신뢰할 수있는 플랫폼 모듈) "Chips"에는 하드웨어 RNG가 있습니다. 불행하게도, 내 Dell 랩톱의 (Broadcom) TPM에는이 기능이 부족하지만 오늘날 판매 된 많은 컴퓨터에는 진정으로 예측할 수없는 양자 기계적 프로세스를 사용하는 하드웨어 RNG가 제공됩니다. 인텔은 열 노이즈 품종을 구현했습니다.

또한 암호화 목적으로 RNG를 시드하기 위해 현재 시간 만 사용하거나 예측할 수없는 응용 프로그램을 사용하지 마십시오. 다른 여러 출처와 함께 시간부터 몇 번의 저 순서 비트를 사용하는 것은 괜찮을 것입니다.

비슷한 질문 당신에게 유용 할 수 있습니다.

이 토론에 늦어서 죄송합니다 (지금은 3 1/2 세가 되었습니까?). 그러나 PRN 생성 및 대체 엔트로피 소스에 대한 관심이 다시 나타났습니다. Linux 커널 개발자 Rusty Russell은 최근 그의 블로그 엔트로피의 대체 공급원 (다른 것 이외 /dev/urandom).

그러나 나는 그의 선택에 깊은 인상을받은 것은 아닙니다. NIC의 MAC 주소는 변경되지 않으며 (다른 모든 것과 고유하지만) PID는 샘플 크기가 너무 작아 보입니다.

나는 a Mersenne Twister (내 Linux 상자에서) 다음 알고리즘으로 시드됩니다. 누군가의 기꺼이 관심과 관심이 있다면 의견/피드백을 요구합니다.

  1. 64 비트 + 256 비트의 배열 버퍼 생성 * 수 /proc 아래 파일.
  2. 이 버퍼의 첫 64 비트에 타임 스탬프 카운터 (TSC) 값을 놓습니다.
  3. 다음 각각에 대해 /proc 파일, SHA256 합계 계산 :

    • /proc/meminfo
    • /proc/self/maps
    • /proc/self/smaps
    • /proc/interrupts
    • /proc/diskstats
    • /proc/self/stat

      각 256 비트 해시 값을 (1)에 생성 된 배열의 자체 영역에 배치하십시오.

  4. 이 전체 버퍼의 SHA256 해시를 만듭니다. 노트: SHA 함수와 완전히 독립적 인 다른 해시 기능을 사용할 수 있습니다.이 기술은 약한 해시 기능에 대한 "보호"로 제안되었습니다.

이제 256 비트가 있습니다 바라건대 Mersenne Twister를 씨앗하기위한 임의 (충분한) 엔트로피 데이터. 위의 것을 사용하여 MT 배열의 시작 (624 32 비트 정수)을 채우고 MT 저자의 코드로 해당 배열의 나머지 부분을 초기화합니다. 또한, 나 ~할 수 있었다 다른 해시 함수 (예 : SHA384, SHA512)를 사용하지만 다른 크기 배열 버퍼가 필요합니다 (분명히).

원래 Mersenne Twister 코드는 하나의 단일 32 비트 씨앗을 요구했지만 나는 그것이 끔찍하게 부적절하다고 생각합니다. 암호화를 찾기 위해 "단지"2^32-1 다른 MTS를 실행하는 것은이 시대와 시대에 실질적인 가능성의 영역을 넘어서는 것이 아닙니다.

나는 이것에 대한 누군가의 피드백을 읽고 싶습니다. 비판은 환영 이상입니다. 나는 나의 사용을 방어 할 것이다 /proc 끊임없이 변화하기 때문에 위의 파일 (특히 /proc/self/* 파일과 TSC는 항상 다른 값 (나노초 [또는 더 나은] 해상도, IIRC)를 산출합니다. 나는 달리기 다이 하드 테스트 이것에 (수백의 조율에 10억 비트), 그리고 그것은 날아 다니는 색으로 지나가는 것 같습니다. 그러나 그것은 아마도 내가 그것을 씨를 시드하는 것보다 PRNG로서 Mersenne 트위스터의 건전성에 대한 더 많은 증거 일 것입니다.

물론, 이것들은 그렇지 않습니다 완전히 누군가를 해킹하는 사람에게는 불 침투하지만, 나는이 모든 것들 (그리고 sha*)이 해킹당하는 것을 보지 못합니다. 그리고 내 생애에 부러졌다.

일부는 키보드 입력 (키 스트로크 사이의 시간 초과)을 사용합니다. 소설에서 라디오 정적 수신이 사용할 수 있다고 생각했지만 물론 다른 하드웨어와 소프트웨어가 필요합니다 ...

우주 전자 레인지 배경 스펙트럼 위에 소음. 물론 먼저 일부 이방성, 전경 물체, 상관 감지기 노이즈, 은하 및 로컬 그룹 속도, 분극 등을 제거해야합니다. 함정은 남아 있습니다.

씨앗의 원천은 그리 중요하지 않습니다. 의사 번호 생성기 알고리즘이 더 중요합니다. 그러나 나는 얼마 전에 일부 은행 운영을위한 씨앗을 생성하는 것에 대해 들었습니다. 그들은 많은 요소를 함께 사용했습니다.

  • 시각
  • 프로세서 온도
  • 팬 속도
  • CPU 전압
  • 나는 더 기억하지 못한다 :)

이러한 매개 변수 중 일부가 시간이 많이 변하지 않더라도 좋은 해싱 기능에 넣을 수 있습니다.

양호한 무작위 숫자를 생성하는 방법?

어쩌면 우리는 inifinite 수의 우주를 고려할 수 있습니까? 이것이 사실이라면, 항상 새로운 병렬 우주가 만들어지고 있다면, 우리는 다음과 같은 일을 할 수 있습니다.

int Random() {
    return Universe.object_id % MAX_INT;
}

매 순간 우리는 평행 우주의 다른 분야에 있어야하므로 다른 ID가 있어야합니다. 유일한 문제는 우주 대상을 얻는 방법입니다 :)

죽기 전에 고정 된 시간 동안 단단한 루프로 변수를 조작하는 실을 회전시키는 것은 어떻습니까? 당신이 끝나는 것은 프로세서 속도, 시스템로드 등에 달려 있습니다 ... 매우 호키이지만 단지 srand (시간 (null))보다 낫습니다 ... ...

임의의 숫자 생성기를위한 "좋은"시드에 대해 걱정하지 마십시오. 시퀀스의 통계적 특성은 발전기의 시드에 의존하지 않습니다.

나는 동의하지 않는다 John D. Cook의 조언. Mersenne Twister를 하나를 제외하고 0으로 설정 한 Mersenne Twister를 시드하면 처음에는 무작위이 아닌 숫자를 생성합니다. 발전기 가이 상태를 통계 테스트를 통과하는 모든 것으로 휘젓는 데 오랜 시간이 걸립니다. 발전기의 첫 32 비트를 씨앗으로 설정하면 비슷한 효과가 있습니다. 또한 전체 주가 0으로 설정되면 발전기는 끝없는 0을 생성합니다.

올바르게 작성된 RNG 코드에는 64 비트 값을 말하고 생성기를 시드하여 가능한 각 입력에 대해 적절한 랜덤 숫자를 생성 할 수있는 적절하게 작성된 시드 알고리즘이 있습니다. 따라서 안정적인 라이브러리를 사용하는 경우 모든 씨앗이 수행됩니다. 그러나 자신의 구현을 함께 해킹하면 조심해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top