뉴비 도와주세요

A,B까지는 풀었는데 C문제에서 p, q를 구하는 방법을 모르겠어요. 소인수분해 알고리즘을 여럿 찾아봤는데도 전부 몇 시간을 들여도 완료가 안되더군요.. p나 q를 구해서 풀이하는 게 맞나요? 아니면 다른 풀이 방법이 있는 건가요?

#crypto
작성자 정보
답변 1
2dedce
워게임 고인물

다른 방법으로 접근해야 합니다.
힌트에서 Non-repudiation란 키워드를 얻을 수 있습니다. 위키백과에서는..

부인봉쇄 - 위키백과: 부인봉쇄(Non-repudiation)란 어떤 분쟁에 말린 관계자가 진술서 혹은 계약서의 유효성을 부인하거나 반박할 수 없도록 보장하는 개념이다.

부인방지(부인봉쇄, Non-repudiation)는 계약서를 작성한 당사자가 이것을 작성하지 않았다고 부인하는 것을 막는 개념입니다. 예를 들어 어떤 사람이 자신의 비트코인 계좌로부터 어디로 코인을 송금시켰다면 나중에 안 보냈다고 할 수 없도록 하는 것입니다.

RSA는 공개키(public key), 개인키(private key)가 구분되어 공개키로 암호화한 것은 비공개키로 복호화를 하게 됩니다. 수식으로 나타내면 암호화는 c=me  mod  Nc = m^e\;\textrm{mod}\;N이고 복호화는 m=(cd  mod  N)=(med  mod  N)=mm=(c^d\;\textrm{mod}\;N)=(m^{ed}\;\textrm{mod}\;N)=m입니다.
근데 sign_message의 코드를 보면

def sign_message(self, m):
    return pow(bytes_to_long(m), self.d, self.N)

오히려 비공개키 dd로 암호화(?)를 하고 있습니다. 즉 mdm^d가 나오는데 이것을 복호화(?)하는 것은 간단하게 공개키 ee로 제곱하고 NN으로 나눈 나머지를 취하면 됩니다. 즉 이것은 암호화(encryption)/복호화(decryption)가 아닙니다. 이것은 서명(signing)과 검증(verification)이라 합니다.

이게 어떻게 작동하는 거냐면 개인키로 서명한 것은 공개키를 사용해야만 유효한 문서가 됩니다. Cody가 s=md  mod  NCs = m^d\;\textrm{mod}\;N_C로 서명한 것(ss는 signature의 앞글자에서 따옴)을 예를 들어 다른 사람 Arnold의 공개키 (65537,NA)(65537, N_A)로 검증하려 해서 s65537  mod  NAs^{65537}\;\textrm{mod}\;N_A를 구하면 해석할 수 없는 쓰레기 값이 나옵니다. 오직 Cody의 공개키로만 검증해야 유효한 메세지를 얻을 수 있습니다. 또한 Cody의 개인키 dd를 모르는 사람은 원하는 내용으로 Cody의 서명을 위조(forgery)하기 힘듭니다. 따라서 Cody의 공개키로 검증이 된 서명은 개인키를 알고 있는 Cody가 작성한 것이 보장되고, 또 Cody는 그것을 작성하지 않았다고 부인할 수 없습니다.

더 궁금한 것은 댓글로, 다른 문제 질문은 추가 질문을 해주시면 성실히 답하겠습니다.

참고
RSA 전자 서명 - 드림핵 강의

2023.11.07. 14:42
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기