컴퓨터가 난수를 생성하는 방법
컴퓨터는 암호 작성에서 비디오 게임 및 도박에 이르기까지 모든 것에 대해 난수를 생성합니다. 난수에는 두 가지 카테고리가 있습니다 - "진정한"난수와 의사 난수 - 암호화 시스템의 보안을 위해서는 그 차이가 중요합니다..
컴퓨터는 예측할 수없는 마우스 움직임이나 팬 잡음과 같은 외부 데이터를 관찰하고 이로부터 데이터를 생성하여 진정한 난수를 생성 할 수 있습니다. 이를 엔트로피라고합니다. 다른 경우 알고리즘을 사용하여 "의사 난수"숫자를 생성하므로 결과가 무작위로 표시됩니다..
이 주제는 최근 인텔의 하드웨어 난수 생성기 칩이 신뢰할 수 있는지 여부를 묻는 질문이 많아지면서 논란이되고 있습니다. 신뢰할 수없는 이유를 이해하려면 처음에 임의의 숫자가 어떻게 생성되는지, 그리고 그 숫자가 어떻게 사용되는지 이해해야합니다..
어떤 난수가 사용되는지
난수는 수천 년 동안 사용되어 왔습니다. 동전을 뒤집거나 주사위를 굴릴 때 최종 결과를 무작위로 남겨 두는 것이 목표입니다. 컴퓨터의 난수 생성기는 비슷합니다. 예측할 수없는 임의의 결과를 얻기위한 시도입니다..
난수 생성기는 많은 다른 목적에 유용합니다. 도박을 목적으로 난수를 생성하거나 컴퓨터 게임에서 예기치 않은 결과를 생성하는 것과 같은 분명한 애플리케이션을 제외하고는 무작위성이 암호화에 중요합니다.
암호에는 공격자가 추측 할 수없는 숫자가 필요합니다. 우리는 같은 번호를 반복해서 사용할 수 없습니다. 우리는이 수치를 예측할 수없는 방식으로 생성하여 공격자가 추측 할 수 없도록하려는 것입니다. 이 임의의 숫자는 파일을 암호화하거나 인터넷상의 HTTPS 웹 사이트를 사용하든 관계없이 안전한 암호화에 필수적입니다..
진정한 난수
컴퓨터가 실제로 어떻게 난수를 생성 할 수 있는지 궁금 할 것입니다. 이 "임의성"은 어디에서 비롯된 것입니까? 컴퓨터 코드 일 뿐이라면 컴퓨터가 생성하는 숫자를 예측할 수 없습니까??
우리는 일반적으로 생성되는 난수에 따라 컴퓨터가 생성하는 난수를 그룹화합니다 : "실제"난수 및 의사 난수.
"실제"난수를 생성하기 위해 컴퓨터는 컴퓨터 외부에서 발생하는 몇 가지 유형의 물리적 현상을 측정합니다. 예를 들어, 컴퓨터는 원자의 방사성 붕괴를 측정 할 수 있습니다. 양자 이론에 따르면, 방사성 붕괴가 언제 일어날지를 알 수있는 방법이 없기 때문에 이것은 우주에서 본질적으로 "순수한 무작위성"입니다. 공격자는 방사성 붕괴가 언제 일어날 지 예측할 수 없으므로 무작위 값을 알지 못합니다.
일상적인 예를 들어, 컴퓨터는 대기 중 잡음에 의존하거나 예측할 수없는 데이터 또는 엔트로피의 원인으로 키보드의 키를 누르는 정확한 시간을 단순히 사용할 수 있습니다. 예를 들어 컴퓨터가 오후 2 시가 지나면 정확하게 0.23423523 초 후에 키를 눌렀 음을 알 수 있습니다 ... 키 누름과 관련된 특정 시간을 충분히 확보하면 "진정한"무작위 생성에 사용할 수있는 엔트로피 소스가 생깁니다 번호. 당신은 예측할 수있는 기계가 아니므로 공격자는이 키를 누를 때 정확한 순간을 추측 할 수 없습니다. 리눅스에서 임의의 숫자를 생성하는 "dev"/ random 장치는 진정한 난수를 반환하기에 충분한 엔트로피를 모을 때까지 "블록"하고 결과를 반환하지 않습니다..
의사 난수
의사 난수는 "참"난수 대신 사용할 수 있습니다. 컴퓨터는 시드 값과 알고리즘을 사용하여 임의로 나타나는 숫자를 생성 할 수 있지만 실제로는 예측할 수 있습니다. 컴퓨터가 환경에서 임의의 데이터를 수집하지 않습니다..
이것은 모든 상황에서 반드시 나쁜 것은 아닙니다. 예를 들어 비디오 게임을하는 경우 해당 게임에서 발생하는 이벤트가 "true"난수 또는 의사 난수로 처리되는지 여부는 중요하지 않습니다. 반면에 암호화를 사용하는 경우 공격자가 추측 할 수있는 의사 난수를 사용하고 싶지 않습니다..
예를 들어, 해커가 의사 난수 생성기에서 사용하는 알고리즘 및 시드 값을 공격자가 알고 있다고 가정 해 봅시다. 그리고 암호화 알고리즘이이 알고리즘에서 의사 난수를 가져 와서 임의의 추가 임의성을 추가하지 않고 암호화 키를 생성한다고 가정 해 봅니다. 공격자가 충분히 알고있는 경우, 그들은 뒤로 작업하여 암호화 알고리즘이 그 경우에 선택 했어야하는 의사 난수를 결정할 수 있고, 암호화를 깨뜨릴 수 있습니다.
NSA 및 인텔의 하드웨어 난수 생성기
개발자가 쉽게 작업 할 수 있고 안전한 난수 생성을 돕기 위해 인텔 칩에는 RdRand라고하는 하드웨어 기반 난수 생성기가 포함되어 있습니다. 이 칩은 프로세서에서 엔트로피 소스를 사용하고 소프트웨어가 요청할 때 난수를 소프트웨어에 제공합니다..
여기서 문제는 난수 생성기가 본질적으로 블랙 박스이고 내부에서 무슨 일이 일어나고 있는지 알 수 없다는 것입니다. RdRand에 NSA 백도어가 포함 된 경우 정부는 해당 난수 생성기에서 제공 한 데이터로만 생성 된 암호화 키를 깨뜨릴 수 있습니다.
이것은 심각한 우려입니다. 2013 년 12 월, FreeBSD의 개발자는 RdRand를 무작위의 근원으로 직접 사용하는 것에 대한 지원을 제거하여 신뢰할 수 없다고 말했습니다. [출처] RdRand 장치의 출력은 엔트로피를 추가하는 다른 알고리즘으로 공급되어 난수 생성기의 백도어가 문제가되지 않도록합니다. 리눅스는 이미 이런 식으로 작업하여 RdRand에서 오는 무작위 데이터를 무작위로 추출하여 백도어가 있더라도 예측할 수 없도록했습니다. [출처] Reddit의 최근 AMA ( "Ask Me Anything")에서 인텔 CEO 인 Brian Krzanich는 이러한 우려에 대한 질문에 대답하지 않았습니다. [출처]
물론 이것은 인텔 칩의 문제 만은 아닙니다. FreeBSD 개발자들은 Via의 칩을 이름으로 불렀습니다. 이 논쟁은 진정으로 무작위이며 예측할 수없는 난수를 생성하는 것이 왜 중요한지를 보여줍니다.
"진정한"난수를 생성하기 위해 난수 생성기는 "엔트로피 (entropy)"또는 주변의 물리적 세계에서 보이는 임의의 데이터를 수집합니다. 그렇지 않은 난수의 경우 정말 무작위 일 필요가 있습니다. 알고리즘과 시드 값을 사용할 수 있습니다..
이미지 신용 : Flickr에 rekre89, Flickr에 Lisa Brewster, Flickr에 Ryan Somma, Flickr에 huangjiahui