RSA 크래킹
면접 대비시간 제한3초메모리 제한1024 MB
1000보다 작은 두 소수의 곱인 n과 공개 지수 e가 주어질 때, 개인 지수 d를 구합니다.
문제

이미지 출처: Sean MacEntee (Flickr), CC BY 2.0
RSA는 널리 쓰이는 공개키 암호 체계다. 이 체계로 두 당사자(사람이나 컴퓨터)는 대화를 엿듣는 누구에게도 정보를 드러내지 않고 비밀 메시지를 주고받을 수 있다. 많은 웹사이트가 안전한 https 연결로 접속할 때 RSA를 사용한다. RSA에서 각 당사자는 서로 다른 두 키를 가진다. 공개되는 공개키와 비밀로 유지되는 개인키다. 특정 수신자에게 보낼 메시지를 암호화하려면 송신자가 수신자의 공개키를 쓴다. 수신자는 자신의 개인키로 메시지를 복호화한다.
RSA 공개키 는 두 수 과 로 이루어진다. 수 은 서로 다른 두 소수 와 의 곱이다. 실제 응용에서는 안전성을 위해 이 수백 자리의 十진수가 된다.
은 오일러 토션트 함수이며, 이 경우 과 같다. 개인키는 로 이루어지며, 은 공개키의 과 같다. 는 다음 합동식의 해다.
형식적으로, 세 정수 , , 에 대해 합동식
는 를 만족하는 정수 가 존재하면 성립한다.
송신자는 메시지 을 으로 계산해 수신자에게 보낸다. 여기서 은 단순화를 위해 와 보다 작은 정수라고 가정한다. 수신자는 오일러 정리에 따라 이므로 을 계산한다. 이로써 원래 메시지가 복원된다. 개인키 없이 과 만으로 을 복원하는 실용적인 방법은 아직 알려지지 않았다.
당신의 과제는 주어진 공개키에 대응하는 개인키를 찾아 RSA를 깨는 것이다.
입력
첫 줄에 테스트 케이스의 개수 ()가 주어진다. 각 테스트 케이스는 두 수 과 가 적힌 한 줄이다.
은 을 만족하는 두 소수 , 의 곱이라고 가정해도 된다. 또한 는 가 존재하고 유일하도록 선택되며, 이다. 곱 는 32비트 정수에 들어가지 않을 수 있다(예: Java의 int 타입).
출력
각 테스트 케이스마다 하나를 출력한다.