AMD 난수 생성기는 정말 0을 못 만들까? '안 나왔다'의 함정
핵심 요약
- 0이 나오지 않았다는 사실만으로 난수 생성기가 0을 만들 수 없다고 결론 내릴 수는 없습니다.
- 균등하고 독립적인 32비트 난수라면 10억 번 추출해도 0이 한 번도 나오지 않을 확률은 약 79%입니다.
- 검증할 때는 몇 비트를 출력하는지, 추출에 성공했는지 확인하고 값을 가공하는 코드도 살펴야 합니다.
- 특정 값이 나오는지와 보안에 필요한 만큼 예측하기 어려운지는 따로 검증해야 합니다.
AMD 난수 생성기가 0을 내놓지 않는다면 하드웨어에 문제가 있는 걸까요? 난수는 암호 키처럼 예측하기 어려워야 하는 값을 만드는 데 쓰입니다. 작은 이상도 신경 쓰이는 이유입니다. 다만 문제가 있는지 판단하려면 먼저 “얼마나 많이 뽑았고, 어떤 값을 세었는가”를 살펴봐야 합니다.
10억 번 뽑아도 0이 안 나오는 이유
동전을 100번 던졌는데 앞면이 한 번도 나오지 않았다면 이상합니다. 나올 수 있는 결과가 두 가지뿐이기 때문입니다.
하지만 32비트 난수로 나올 수 있는 정숫값은 약 43억 개나 됩니다. 모든 값이 같은 확률로 나오고, 매번 서로 독립적으로 값을 뽑는다고 가정해 보겠습니다. 이때 한 번 뽑아서 정확히 0이 나올 확률은 42억 9,496만 7,296분의 1입니다.
이 조건에서는 10억 번을 뽑아도 0이 한 번도 나오지 않을 확률이 약 79%입니다. 계산식은 (1 - 1/2^32)^1000000000입니다.
10억 번이나 반복했다면 충분히 많이 뽑았다고 느낄 만합니다. 하지만 43억 개의 값 중 특정 숫자 하나를 기다리는 실험이라면, 그 숫자가 한 번도 나오지 않는 경우가 더 흔합니다.
평균적으로 약 43억 번에 한 번 나온다는 말도 오해하기 쉽습니다. 43억 번을 채우면 반드시 나온다는 뜻은 아닙니다. 앞에서 0이 나오지 않았다고 해서 다음에 뽑을 때 나올 확률이 높아지는 것도 아닙니다.
그러니 “0을 못 봤다”는 결과를 어떻게 받아들일지는 표본 수와 출력 범위에 달려 있습니다. 같은 10억 번이라도 8비트 출력 전체가 0인지 검사했을 때와 64비트 출력 전체가 0인지 검사했을 때의 의미는 완전히 다릅니다.
우리가 보고 있는 0은 어디에서 나온 값일까요
난수를 검사하려면 우선 무엇을 검사하는지부터 분명히 해야 합니다.
32비트 정수 전체가 0인지 보는 것과 그 정수의 마지막 8비트가 모두 0인지 보는 것은 다른 실험입니다. 균등한 32비트 난수라면 마지막 8비트가 모두 0일 확률은 256분의 1입니다. 정수 전체가 0일 확률보다 훨씬 높습니다.
프로그램이 보여 주는 값이 하드웨어에서 받은 그대로인지도 확인해야 합니다. 중간에 거치는 코드가 값의 범위를 바꾸거나 특정 값을 걸러 낼 수 있습니다.
예를 들어 프로그램이 0을 받으면 다시 뽑도록 짜여 있다면, 아무리 기다려도 최종 출력에 0은 나오지 않습니다. 프로그램에 정해 둔 규칙 때문에 생기는 일입니다.
성공 여부와 반환값도 구분해야 합니다. 성공했는지를 따로 알려 주는 인터페이스라면 성공한 결과만 난수 표본으로 세어야 합니다. 호출에 실패한 뒤 남아 있는 값을 정상적인 난수로 세면 분석이 어긋납니다.
그래서 AMD라는 제조사 이름만으로는 무엇을 검증했는지 충분히 알 수 없습니다. CPU 모델과 사용한 명령어나 인터페이스를 알아야 합니다. 출력 비트 수와 값을 처리한 코드까지 있어야 같은 실험을 재현할 수 있습니다.
정말로 0이 빠져 있다면 어떤 문제일까요
이번에는 충분히 검증한 끝에 어떤 생성기가 0을 절대 출력하지 않는다고 확인했다고 가정해 보겠습니다.
그 생성기가 전체 비트 범위에서 균등한 정수를 제공한다고 약속했다면, 출력 분포가 그 약속과 다르다는 뜻입니다. 나올 수 있어야 하는 값 하나가 빠져 있기 때문입니다.
그렇다고 곧바로 “암호 키를 예측할 수 있다”는 결론을 내릴 수는 없습니다. 특정 값이 나오지 않는 현상과 다음 값을 알아맞힐 수 있는 취약점은 따로 분석해야 합니다.
반대로 0이 한 번 나왔다고 해서 보안에 적합한 난수 생성기라고 인정할 수도 없습니다. 0부터 차례대로 숫자를 세는 프로그램도 0을 출력합니다. 하지만 그다음 값은 누구나 맞힐 수 있습니다.
보안에 쓸 수 있는지 판단하려면 더 살펴봐야 합니다. 출력에 반복되는 패턴이 있는지, 이전 값을 알아도 다음 값을 예측하기 어려운지 확인해야 합니다. 내부 상태가 노출됐을 때 어떤 영향을 받는지도 따져야 합니다.
하드웨어 난수 생성기도 물리적 잡음을 얻는 부분과 이를 출력값으로 가공하는 부분을 나눠서 살펴야 합니다. 화면에 찍힌 숫자만 보고 내부의 어느 단계에서 문제가 생겼는지 알아내기는 어렵습니다.
하드웨어를 믿기 위해 필요한 확인
“0이 안 나온다”는 관찰을 검증하려면 우선 정상적인 생성기에서도 그런 결과가 얼마나 자주 나오는지 계산해야 합니다. 앞서 본 32비트·10억 회 사례처럼 정상이라고 가정해도 흔히 나오는 결과라면, 그 관찰만으로 결함이 있다고 보기는 어렵습니다.
그다음에는 테스트 코드가 값을 빠뜨리거나 바꾸지 않는지 살펴야 합니다. 같은 조건으로 실험을 반복해도 결과가 유지되는지 확인해야 합니다. 다른 CPU와 비교할 때도 비트 수와 성공한 추출 횟수 같은 조건을 맞춰야 합니다.
통계 검사에서는 특정 숫자가 얼마나 자주 나오는지 외에도 살펴볼 것이 있습니다. 비트별 비율이나 연속된 출력 사이의 관계도 검사할 수 있습니다. 다만 이런 검사를 통과했다고 해서 출력을 예측할 모든 가능성이 사라지는 것은 아닙니다.
AMD 난수 생성기가 정말 0을 못 만드는지 판단하려면 어떤 조건에서 관찰했고 같은 결과를 다시 얻었는지 확인해야 합니다. 하드웨어 난수에 대한 신뢰를 따지려면 출력값뿐 아니라 인터페이스와 구현도 함께 검증해야 합니다. “수억 번 돌렸는데도 안 나왔다”는 말만으로는 부족합니다. 몇 번 뽑았는지와 함께, 나올 수 있는 값이 모두 몇 개인지도 알아야 합니다.
댓글
댓글을 불러오는 중...