만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

해시 충돌

시간 제한1초메모리 제한2048 MB

요약
비밀 함수 f의 값을 질의로 받아 f^c(r) = c인 쌍 (c, r) 두 개를 질의 횟수 제한 안에서 찾습니다.
난이도

보통10점 중 6점

유형
그래프, 수학
정답자
아직 제출이 없습니다

해시 충돌

보안상의 이유로 TU Delft는 많은 방의 문에 숫자 키패드가 달린 자물쇠를 설치하려고 한다. 각 방에는 고유한 비밀번호가 있다. 모든 비밀번호를 저장할 서버를 구축하는 일은 Harry와 Sharon에게 맡겨졌다.

사이버 보안 수업을 들은 두 사람은 비밀번호를 저장하기 전에 해시 함수에 여러 번 통과시키는 것이 좋다는 것을 안다.

Sharon은 방 번호를 비밀번호를 해시 함수에 통과시키는 횟수로 쓰자고 제안했다. 그러면 비밀번호가 같은 두 방이라도 해시 값이 반드시 같지는 않다. 그런데 방 번호와 비밀번호의 조합에 따라 해시 값이 원래 비밀번호와 같아지는 경우가 있어, 보안상 위험하다.

Harry는 역할을 바꾸자고 제안했다. 비밀번호를 방 번호에 해시 함수를 적용하는 횟수로 쓰는 것이다. cc를 비밀번호, rr을 방 번호라고 하면 해시 값은 fc(r)=f(⋯f(⏟ctimesr)⋯ )f^c(r) = \underbrace{f(\cdots f(}_{c \mathrm{times}}r)\cdots)이다.

Sharon은 함수 ff가 무엇이든 fc(r)=cf^c(r) = c를 만족하는 방 번호와 비밀번호가 항상 존재한다고 주장했다. ff의 세부 사항을 몰라도 그런 쌍을 두 개 찾는 것은 어렵지 않다고 덧붙였다.

Harry는 Sharon이 자기 제안을 질투해서 그런다고 생각했고, 논쟁은 결론 없이 끝났다. 그래서 Harry는 Sharon에게 주장을 증명해 보라고 했다. Harry는 자신이 고른 비밀 해시 함수 ff를 사용해, 질의로 받은 cc와 rr에 대한 해시 값 fc(r)f^c(r)을 돌려주는 프로그램을 작성했다. 이 해시 함수는 nn이 주어졌을 때 {1,…,n}\{1,\dots,n\}에 속하는 임의의 rr을 받고, 같은 범위의 값을 돌려준다. cc의 값도 같은 범위에 있어야 한다. Sharon의 과제는 제한된 횟수의 질의만으로 fc(r)=cf^c(r) = c를 만족하는 cc와 rr을 찾는 것이다.

당신은 Sharon의 주장이 옳다는 것을 알고 있으며, 그녀를 돕기로 한다.

예제2

  1. 예제 1

    입력
    6
    
    3
    
    5
    
    4
    
    6
    
    2
    
    
    예상 출력
    
    ? 2 4
    
    ? 4 1
    
    ? 5 5
    
    ? 1 6
    
    ? 2 1
    
    ! 2 1
    
  2. 예제 2

    입력
    4
    
    2
    
    4
    
    2
    
    
    예상 출력
    
    ? 1 3
    
    ? 2 3
    
    ? 3 3
    
    ! 4 3