디피-헬만 키 교환.
Alice와 Bob은 디피-헬만 키 교환으로 비밀을 공유해요. 두 사람은 소수로 시작해서 개인 키를 고르고, 공개 키를 만들어 공유한 다음, 공유 비밀 키를 만들어요.
테스트 프로그램이 소수 p와 g를 제공해요.
Alice는 1보다 크고 p보다 작은 개인 키 a를 골라요. Bob도 같은 방식으로 개인 키 b를 골라요.
Alice는 공개 키 A를 계산해요.
A = gᵃ mod p
같은 p와 g를 사용해서 Bob도 자신의 개인 키 b로 공개 키 B를 계산해요.
Alice와 Bob은 공개 키를 교환해요. Alice는 비밀 키 s를 계산해요.
s = Bᵃ mod p
Bob은 다음을 계산해요.
s = Aᵇ mod p
두 계산은 같은 결과를 내요! 이제 Alice와 Bob은 비밀 s를 공유해요.
Python 3.6부터는 "난수"를 만들어 내는 서로 다른 두 모듈이 있어요.
random이라는 모듈은 의사 난수예요. 즉, 진정한 난수를 만들어 내는 것이 아니라, 난수를 흉내 내는 알고리즘을 따를 뿐이에요. 이렇게 만들어진 "난수"는 이미 알려진 알고리즘을 통해 만들어지기 때문에 진정한 난수가 아니에요. 그래서 random 모듈은 암호학에 적합하지 않고, 사용해서도 안 돼요. 바로 의사 난수이기 때문이에요.
secrets라는 모듈은 암호학적으로 강력한 "난수"를 만들어 내서, 암호학에 필요한 더 강한 보안을 제공해요. 엄밀히 말하면 이 난수도 의사 난수예요. 하지만 이 모듈이 만들어 내는 숫자는 절대 예측할 수 없다는 보장이 있어요.
이건 연습 문제일 뿐이니까 random 모듈을 써도 괜찮아요. 다만 실제로 암호학에 사용하면 매우 안전하지 않을 거라는 점은 기억해 두세요.
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.