친구 인 Bob이 올바른 전화 번호를 가지고 있는지 확인해야하지만 직접 요청할 수는 없습니다. 당신은 카드에 질문을 써서 카드를 밥에게 가져 가서 답을 줄 이브에게 주어야합니다. Bob이 메시지를 인코딩하여 Eve가 전화 번호를 읽을 수 없도록하려면 카드 외에 무엇을 카드에 써야합니까?
참고 : 이 질문은 “Google 인터뷰 질문”목록에 있습니다. 결과적으로 웹에는이 질문에 대한 수많은 버전이 있으며, 그 중 다수는 명확하거나 정답이 없습니다.
참고 2 : 이 질문에 대한 우스꽝스러운 대답은 Bob이 “call me”라고 써야한다는 것입니다. 그렇습니다. ‘상자 밖에서’그리고 모든 것이 매우 영리하지만, 우리의 영웅을 “Bob”이라고 부르는 CS의 분야와 그의 도청하는 적을 “Eve”라고하는 기술은 사용하지 않습니다.
업데이트 :
귀하와 Bob이 모두 합리적으로 완료 할 수있는 알고리즘의 보너스 포인트.
업데이트 2 :
Bob은 임의의 메시지를 보내지 않아도되지만 Eve가 해독 할 수없는 올바른 전화 번호를 가지고 있는지 확인하면 더 간단한 해결책으로 이어질 수 있습니다.
답변
먼저 우리는 이브가 수동적이라고 가정해야합니다. 이 말은 그녀가 진실로 카드를 밥에게 보내고, 앨리스에게 돌려주는 것은 실제로 밥의 반응입니다. Eve가 데이터를 하나 또는 두 방향으로 변경할 수 있고 (그녀의 조치가 감지되지 않은 경우) 아무 문제가 없습니다.
(오래된 전통을 존중하기 위해 대화에 참여한 두 정직한 당사자를 앨리스와 밥이라고합니다. 본문에서 “당신”이라고 말했지만 내 실제 이름은 “앨리스”가 아니지만, 당신이 쓴 것처럼 응답 할 것입니다. 것을 앨리스는 밥의 전화 번호를 확인하고 싶어.)
간단한 (그러나 약한) 대답은 해시 함수를 사용하는 것입니다. Alice는 카드에 다음과 같이 씁니다. “전화 번호의 SHA-256 해시를 반환하십시오.” SHA-256 은 해시 함수에 관한 한 안전한 것으로 여겨지는 암호화 해시 함수입니다. 수작업으로 계산하는 것은 지루하지만 여전히 가능합니다 (각 작업이 추가, 단어 이동 또는 회전 또는 비트의 비트 조합 인 약 2500 32 비트 작업입니다 .Bob은 하루에 또는 그래서).
이제 약점은 무엇입니까? 암호화 해시 함수 인 SHA-256은 “사전 이미지”에 내성이 있습니다. 이는 해시 출력이 주어지면 해당 입력을 복구하는 것이 매우 어렵다는 것을 의미합니다 (이브가 직면 한 문제임). 그러나 “매우 어렵다”는 “가장 쉬운 방법은 무차별 대입 : 일치하는 것을 찾을 때까지 가능한 입력을 시도하는 것”을 의미합니다. 문제는 여기서 무차별적인 힘이 쉽다는 것입니다. 가능한 전화 번호가 많지 않습니다 (북아메리카에서는 10 자리 숫자, 즉 100 억에 불과합니다). 밥은 손으로 일을하고 싶어하지만 이브가 그렇게 제한되어 있다고 가정 할 수는 없습니다. 기본 PC는 초당 수백만 SHA-256 해시를 시도 할 수 있으므로 Eve는 1 시간 이내에 완료됩니다 (GPU를 사용하는 경우 5 분 미만).
이것은 일반적인 문제입니다. Bob이 결정 론적이라면 (즉, Alice의 특정 메시지에 대해 항상 동일한 응답을 반환 할 것임) Eve는 그를 시뮬레이션 할 수 있습니다. 즉, Eve는 전화 번호를 제외하고 Bob에 관한 모든 것을 알고 있으므로 사실상 전화 번호 만 다른 100 억 명의 Bob을 운영합니다. 그녀는 가상 밥 중 하나가 실제 밥이 실제로 돌려 준 것을 돌려주기를 기다립니다. 이 결함은 임의의 nonces 및 대칭 암호화와 관련된 많은 종류의 “스마트”솔루션에 영향을 미칩니다. 그것은 강력한 결점이며 그 근본 원인은 Eve와 Bob의 컴퓨팅 성능에 큰 차이가 있습니다 (Bob 도 Eve보다 큰 컴퓨터를 보유한 경우 느리게 사용할 수 있음)많은 반복을 사용하여 해시 함수; 암호 대신 전화 번호를 사용하여 암호 해싱이 어느 정도인지 확인하십시오. 참조 bcrypt 또한 이 답변을 ).
따라서 약하지 않은 솔루션 은 Bob에게 임의의 무작위성을 포함 해야합니다 . Bob은 동전을 뒤집거나 주사위를 반복적으로 던져서 계산에 값을 주입해야합니다. 또한 Eve는 Bob이 수행 한 작업을 공개 할 수 없어야하지만 Alice가 할 수 있어야하므로 일부 정보는 기밀 정보가 Bob에서 Alice 에게 전달 됩니다. 이것을 비대칭 암호화 또는 적어도 비대칭 키 계약이라고합니다. 계산하지만 여전히 합리적으로 안전한 해당 클래스의 가장 간단한 알고리즘은 PKCS # 1 v1.5 패딩을 사용한 RSA 입니다 . RSA는 을 공개 지수로 사용할 수 있습니다 . 따라서 프로토콜은 다음과 같습니다.
-
Alice는 큰 정수 생성합니다. 여기서 와 는 비슷한 크기의 소수입니다. 따라서 의 크기는 보안을 보장하기에 충분합니다 (예 : 2012 년 현재 1024 비트 이상). 또한 Alice는 과 이 3의 배수가 되지 않도록 배열해야합니다 .p q n p − 1 q − 1
-
Alice는 카드에 을 씁니다 .
-
밥은 제 패딩하는 만큼의 바이트 순서로 자신의 전화 번호를 00 02 XX XX … XX 00 BB BB .. (BB)의 10 바이트는 ‘BB’여기서 어떤 인코딩을 (PKCS # 1에 의해 기술이 의미하는 바와 같이, 전화 번호 및 ‘xx’는 0이 아닌 임의의 바이트 값이며, 이 1024 비트 정수인 경우 총 길이는 128 바이트 입니다.n
-
Bob은 자신의 바이트 시퀀스를 큰 정수 값 (big-endian encoding) 으로 해석하고 (그래서 매우 큰 정수를 사용한 곱셈과 나눗셈, 결과는 나눗셈의 나머지). 그것은 여전히 손으로 할 수 있습니다 (그러나 다시, 아마도 하루의 더 좋은 부분이 걸릴 것입니다). 그 결과 Bob은 Alice에게 다시 보냅니다.m 3 m o d n
-
Alice는 와 에 대한 지식을 사용 하여 Bob이 보낸 에서 을 복구 합니다. RSA 의 Wikipedia 페이지 에는 해당 프로세스에 대한 합리적인 설명이 있습니다. Alice가 가졌 으면 패딩을 제거 할 수 있으며 ( ‘xx’는 0이 아니므로 첫 번째 ‘bb’바이트는 분명하게 위치 할 수 있습니다) 그런 다음 전화 번호를 갖게됩니다.q m m 3 m o d n m
Alice의 계산에는 컴퓨터가 필요합니다 (컴퓨터가하는 일은 항상 초등적이고 수작업으로 수행 할 수 있지만 컴퓨터는 엄청나게 빠르기 때문에 실제로 “doable”은 너무 많은 시간이 걸릴 수 있습니다. 수동으로 RSA 해독 에는 많은 시간 이 소요됩니다 주).
(실제로 우리는 McEliece 암호화 를 사용하여 더 빠른 수동 계산을 할 수 있었지만 Alice가 카드에 쓰는 공개 키는 엄청날 것이며 카드는 단순히하지 않을 것입니다. 이브는 전체 책을 운송해야합니다 자릿수.)
답변
RSA 와 같은 공개 키 암호화 시스템 의 고전적인 응용 프로그램처럼 보입니다 .
공개 키를 함께 보내면 BoB가 연락처 목록에서 전화 번호를 암호화하여 사용자에게 다시 보냅니다.
답변
가장 기본적인 작업 중 하나는 Diffie-Hellman 키 교환 입니다. 리스너가 키 자체를 파생시킬 수없는 방식으로 키를 협상하므로 통신이 시작되기 전에 키를 설정할 필요가 없습니다. 자세한 내용은 포괄적 인 Wikipedia 기사 를 참조하십시오.
Bob DH 매개 변수 및 ( 는 적합한 소수이고 일반적으로 적은 수임)와 공개 키 . 여기서 는 큰 비밀 번호입니다. (개인 키) 및 Bob이 다음을 다시 보내도록 지시합니다.g p g g a m o d p a
- 그의 공개 키 . 여기서 는 자신이 선택한 비밀 번호입니다.b
- 그가 믿는 것은 공유 비밀 에서 파생 된 키로 대칭 암호화 알고리즘을 사용하여 암호화 된 전화 번호 입니다.
Eve는 및 를 볼 수 있지만 .g b m o d p g a
제대로 구현되고 커뮤니케이터와 공격자가 모두 동일한 계산 능력을 가지고있는 한 이것은 안전합니다.
답변
Bob은 해독 할 수있는 메시지를 보내지 않아도됩니다. 그는 당신에게 그가 당신의 전화 번호를 가지고 있음을 증명해야합니다. 따라서 Cryptographic Hash Functions (단방향 암호화)는 공개 키 암호화 시스템의 대안을 제공합니다. SHA-2 는 현재 이러한 기능의 일반적인 예입니다.
이 전략에서는 Bob의 메시지를 다시 해독 할 필요가 없습니다. Bob에게 어떤 해시 함수를 사용하길 원하는지 알려주십시오 (예 : “Bob, SHA-2를 사용하여 내 전화 번호를 암호화하고 Eve가 결과를 나에게 다시 전달하도록하십시오”). 그런 다음 동일한 알고리즘을 사용하여 전화 번호를 해시하고 Bob과 동일한 해시를 얻었는지 확인하십시오. 두 개의 서로 다른 전화 번호가 동일한 해시를 초래할 가능성은 거의 없으므로 Bob이 올바른 전화 번호를 가지고 있는지 여부를 확인할 수 있습니다.
Bob과 Eve가 해시 함수를 계산할 수있는 컴퓨터가없는 경우 (또는 무차별 대입 공격을 수행하는 경우) 무차별 대입 공격에 대한 일부 보안을 희생하지만 해쉬 함수를 사용하는 것이 가능할 수 있습니다. 계산합니다.
답변
앨리스와 밥은 같은 색에 동의합니다. 이브가 그 사실을 알고 있다면 문제가되지 않습니다. 우리는 이것을 P라고 부를 것입니다. 노랑이라고 해봅시다. 이제 Alice와 Bob은 모두 “x”와 같이 개인 색상을 임의로 선택합니다. 앨리스는 빨간색을 선택하고 밥은 파란색을 선택합니다. 이제 그들은 P와 함께 섞습니다. 이제 Alice는 주황색이고 Bob은 녹색입니다. Alice는 주황색을 Bob에게 보내고 Bob은 녹색을 Alice Eve에게 보냅니다. 이제 Alice Eve는 노란색, 주황색 및 녹색을 알고 있지만 자신의 개인 색은 빨간색을 알고 있으며 밥은 자신의 개인 색을 알고 있습니다. Alice와 Bob은 모두 원래의 개인 색상을 사용하여 방금 교환 한 색상에 추가합니다. 이제 원래의 개인 색상, 빨간색과 파란색을 공유 색상으로 혼합하면 둘 다 동일한 색상, 갈색 또는 벽돌색으로 표시됩니다.
대신 함께 색상을 혼합, 당신이 사용할 수있는
p가 큰 소수가되도록하고, g는 P의 원시적 루트 때문에 당신이 할 경우 어떤 X의 경우, 결과 (0과 p-1 사이의 숫자)는 그중 하나 일 가능성이 높 으므로 기본 근본이있는 이유입니다. p가 소수 2n + 1 인 경우 n도 소수이면 2는 p의 근본임을 알 수 있습니다 (즉, 근본 인 근본을 계산할 필요가 없습니다). 공유 비밀 = 밥 및 앨리스.
카드에 다음과 같이 쓸 수 있다고 생각합니다.
숫자는 3,5 및 7의 배수입니다 (예 :).
있습니다 ( 가능성 숫자의 번호입니다) 그리고 그 생각은 단지 그것에 대해 생각을 알 수있는 일에 대한 몇 가지 몇 가지 가능성을 무효로합니다. 따라서 이브의 암호 해독은 발생하지 않습니다.
답변
Bob에게 숫자에 2 또는 3을 곱하거나 그 숫자와 숫자 자체를 곱하도록 요청하십시오. 숫자를 알면 손으로 할 수 있고 뒤집을 수 있습니다. sha, rsa 또는 md5가 없습니다. 평범한 수학.
답변
전화 번호로 암호화 된 코드 워드를 Bob에게 보냅니다. 그가 당신에게 코드 단어를 다시 보내면 당신은 그가 올바른 번호를 가지고 있다는 것을 알고 있습니다.
약점은 Eve가 Bob을 시뮬레이션 할 수 있다는 것이므로 Bob이 리턴 한 코드 워드를 제공하는 전화 번호를 얻을 때까지 모든 전화 번호를 사용하십시오.
따라서 Bob에게 매우 큰 난수를 코드 워드에 추가 한 다음 암호화하여 다시 보내십시오. 이브는 원하는만큼 넓은 검색 공간을 만듭니다.