NP 완료 문제를 사용한 비밀번호 해싱


16

일반적으로 사용되는 비밀번호 해싱 알고리즘은 오늘날 다음과 같이 작동합니다. 비밀번호에 소금을 바르고 KDF에 공급합니다. 예를 들어, PBKDF2-HMAC-SHA1을 사용하는 경우 비밀번호 해싱 프로세스는 DK = PBKDF2(HMAC, Password, Salt, ...)입니다. HMAC는 패딩 된 키가있는 2 라운드 해싱이고 SHA1은 일련의 순열, 시프트, 회전 및 비트 연산을 기본으로하기 때문에 전체 프로세스는 특정 방식으로 구성된 일부 기본 연산입니다. 기본적으로 그들이 실제로 계산하기가 얼마나 어려운지는 분명하지 않습니다. 아마도 단방향 함수가 여전히 믿기 때문에 역사적으로 중요한 암호화 해시 함수가 안전하지 않고 더 이상 사용되지 않는 것을 보았습니다.

더 완전한 이론적 토대를 제공하기 위해 새로운 방법으로 암호를 해시하기 위해 NP 전체 문제를 활용할 수 있는지 궁금합니다. 핵심 아이디어는 P! = NP라고 가정하고 (P == NP이면 OWF가 없으므로 현재 체계도 중단됨) NPC 문제는 답을 쉽게 확인할 수 있지만 계산하기 어렵다는 것을 의미합니다. 이 특성은 비밀번호 해싱 요구 사항에 적합합니다. 암호를 NPC 문제에 대한 답변으로 볼 경우 NPC 문제를 암호 의 해시 로 저장하여 오프라인 공격에 대응할 수 있습니다. 암호를 확인하기는 쉽지만 크랙하기는 어렵습니다.

주의 사항은 동일한 암호가 NPC 문제의 여러 인스턴스에 매핑 될 수 있다는 것입니다. 모두 해결하기 어려운 것은 아닙니다. 이 연구의 첫 단계로, 이진 문자열을 3-SAT 문제에 대한 해답으로 해석하고 이진 문자열이 솔루션 인 3-SAT 문제의 인스턴스를 구성하려고했습니다. 가장 간단한 형태로 이진 문자열은 3 비트 (x_0, x_1, x_2)를 갖습니다. 그런 다음 2 ^ 3 == 8 절이 있습니다.

000 (    (x_0) v    (x_1) v    (x_2) )
--------------------------------------
001 (    (x_0) v    (x_1) v NOT(x_2) )
010 (    (x_0) v NOT(x_1) v    (x_2) )
011 (    (x_0) v NOT(x_1) v NOT(x_2) )
100 ( NOT(x_0) v    (x_1) v    (x_2) )
101 ( NOT(x_0) v    (x_1) v NOT(x_2) )
110 ( NOT(x_0) v NOT(x_1) v    (x_2) )
111 ( NOT(x_0) v NOT(x_1) v NOT(x_2) )

이진 문자열이 000이라고 가정합니다. 그런 다음 1/8 절만 거짓 (첫 번째)입니다. 첫 번째 절과 AND의 나머지 7 절을 버린다면 000은 결과 공식의 해입니다. 따라서 공식을 저장하면 000을 확인할 수 있습니다.

문제는 3 비트 문자열의 경우 7 개의 다른 절이 표시되면 어느 절이 빠졌는지 즉시 알 수 있으며 비트가 표시됩니다.

나중에 나는 그중 3 개를 버리고 001, 010, 100, 111로 표시된 4 개만 유지하기로 결정했습니다. 이것은 때때로 충돌을 일으키지 만 문제를 덜 사소하게 만듭니다. 충돌이 항상 발생하는 것은 아니지만 입력에 더 많은 비트가있을 때 충돌이 사라질지 여부는 아직 알려지지 않았습니다.

편집하다. 이진 문자열이 (000, 001, ..., 111) 중 하나 일 수있는 일반적인 경우에는 여전히 7이 참이고 1이 거짓 인 8 개의 절이 있습니다. 진실 가치를 제공하는 4 가지 조항을 선택하십시오 (001, 010, 100, 111). 이것은 아래의 프로토 타입 구현에 반영됩니다.

편집하다. 아래의 @DW에 의해 표시된 답처럼, 절을 선택하는이 방법은 주어진 변수 세트에서 절이 너무 많아서 값을 빠르게 좁힐 수 있습니다. 총 7 * C (n, 3) 절 중에서 절을 선택하는 다른 방법이 있습니다. 예를 들어 : 주어진 변수 세트에서 다른 수의 절을 선택하고 인접한 변수 ((x_0, x_1, x_2), (x_1, x_2, x_3), (x_2, x_3, x_4), .. )을 클릭하여 도당 대신 사이클을 형성하십시오. 직관적으로 유도를 사용하여 할당을 시도하여 모든 절을 만족시킬 수 있는지 여부를 테스트 할 수 있으므로이 방법은 제대로 작동하지 않을 수 있습니다. 전체 구조를 간단하게 설명하기 위해 현재 방법을 간단히 사용하겠습니다.

n 비트 문자열의 절 수는 4 * C (n, 3) = 4 * n * (n-1) * (n-2) / 6 = O (n ^ 3)입니다. 해시 는 암호 크기의 다항식입니다.

파이썬에는 프로토 타입 구현이 있습니다 . 사용자 입력 이진 문자열에서 3-SAT 문제 인스턴스를 생성합니다.


이 긴 소개 후에 마침내 내 질문 :

  1. 위의 구성 (프로토 타입에 구현 된)이 안전한 암호 해싱으로 작동합니까, 아니면 적어도 유망한 것으로 수정 될 수 있습니까? 그렇지 않은 경우 어디에서 실패합니까?

  2. 선택할 수있는 7 * C (n, 3) 절이 있기 때문에 임의의 도움을 받아 암호 해시로 사용하기에 적합한 안전한 3-SAT 인스턴스를 구성하는 다른 방법을 찾을 수 있습니까?

  3. 입증 된 보안 암호 해싱 체계를 설계하기 위해 NP 완성도를 활용하려는 유사한 작업이 있습니까? 이미 몇 가지 결과 (긍정적이든 부정적이든)를 얻었습니까? 일부 소개와 링크는 매우 환영받을 것입니다.


편집하다. 나는 @DW의 아래 답변을 받아 들였다. 그는 처음 답변을 받았고 문제 구조와 유용한 자료에 대해 큰 통찰을 주었다. 여기에 소개 된 순진한 절 선택 체계 (Python 프로토 타입에서 구현 됨)는 소규모 그룹에서 변수 할당을 빠르게 좁힐 수 있기 때문에 작동하지 않는 것 같습니다. 그러나 이러한 NPC-to-PasswordHashing 감소가 전혀 작동하지 않는다는 공식적인 증거를 보지 못했기 때문에 문제는 여전히 열려 있습니다. 이 특정 3-SAT 감소 문제에도 불구하고 여기에 열거하고 싶지 않은 절을 선택하는 다른 방법이있을 수 있습니다. 따라서 모든 업데이트 및 토론은 여전히 ​​환영합니다.


조항 생성을 sat solver (pycosat를 사용하는 picosat)에 연결 했습니다 . nbits = 300의 경우 가장 긴 것은 절을 생성하는 것이며, pycosat는 인스턴스를 종료합니다. 조항 생성이 실제로 매우 길기 때문에 300을 넘지 않았습니다. 또한 0 ... 0은 항상 세대의 솔루션입니다. 항상 그러한 '쉬운'해결책이 있다면 이것은 효과가 없을 것입니다.
holf

답변:


17

불행히도, 이것은 작동하지 않는 것 같습니다 (자세한 내용은 아래 참조). 이런 종류의 아이디어가 확실한 보안 체계를 만들 수있는 방법을 찾기가 어렵습니다.

일반적인 아이디어의 문제

NP- 완전 문제를 기반으로 암호화를 시도한다는 아이디어를 처음으로 생각한 사람은 아닙니다. 문제는 NP 경도가 최악의 경도만을 보장하지만 암호화에는 평균 케이스 경도가 필요하다는 것입니다. NP- 완전 문제 (예 : 배낭 암호 시스템)를 기반으로 암호화를 시도하는 여러 가지 시도가 있었지만 제대로 진행되지 않았습니다. 일반적으로 사람들은 최악의 경우에 기하 급수적이더라도 평균적으로 효과적인 알고리즘 (또는 사소한 확률로)을 발견합니다. 이것은 NP 경도와 모순되지 않더라도 암호를 해독하기에 충분합니다.

나는 그 주제에 관해 더 많은 것을 읽는 것이 좋습니다. 암호화의 NP-Hard 문제의 중요성 , 일방 함수 이외의 평균 사례 복잡성 열린 문제 , Impagliazzo의 세계 상태 에서 유용한 시작점을 찾을 수 있습니다 . , 평균의 경우 감소로 최악의 경우 .

특정 체계의 문제

특정 제안이 완전히 지정되지 않았습니다. 체계를 분석하려면 체계가 작동하는 방식을 완전히 지정해야합니다. 귀하의 경우 일반적인 예에서 7 절 중 4 절을 어떻게 선택했는지 명확하지 않습니다. (단일 예는 일반적인 방법을 설명하는 사양을 대체하지 않습니다.)

x0,x1,x2,x3,x425이 5 개의 변수에 가능한 할당이므로, 모두 시도하고 40 개의 조항 중 하나에 의해 위반 된 모든 할당을 폐기하십시오. 나는 이것이 모든 절과 일치하는 약 하나의 과제 만 남길 것이라고 예측합니다.

1/21/2102517/8(7/8)4027.7(251)×27.70.15

이는 5 개의 변수 그룹마다 반복 될 수 있으며 각 변수에 대한 고유 한 만족 할당을 고유하게 복구합니다. 모호성이있는 경우 다른 과제와 비교하여 후보 과제를 확인할 수 있습니다.

이런 식으로, 우리는 일반적으로 절차에 의해 생성 된 3SAT 인스턴스 클래스를 해결하는 효율적인 알고리즘이 있음을 알 수 있습니다. 모든 3SAT 인스턴스를 해결하지는 않지만 생성 한 인스턴스에는 특수 구조가 있으며 해당 특수 구조를 가진 인스턴스를 효과적으로 해결합니다. 이는 3SAT의 일부 인스턴스가 다른 인스턴스보다 쉬우 며 3SAT의 경도 (최악의 경우 복잡도)는 생성 한 특수 인스턴스의 경도 또는 평균 3SAT 인스턴스의 경도에 대해 거의 또는 전혀 언급하지 않습니다.


전체 사양으로 작동하는 참조 구현이 있습니다. 이 첫 번째 시도에서 계획은 정말 간단합니다. 암호를 대체 할 때 001, 010, 100 및 111을 제공하는 4 개의 절을 선택했습니다. 이는 각 절에 대해 8 개 중 4 개의 유효한 조합을 제공합니다.
Cyker

당신은 아마이 빠른 것이 너무 많은 절을 제공하여 솔루션의 범위를 좁힐 수있게하는 것이 맞을 것입니다. 그러나 우리는 O (n ^ 3) 절로 시작하며 유지할 항목을 자유롭게 선택할 수 있습니다. 트리플렛은 독립적이지 않을 수 있습니다. 따라서 휴리스틱 분석이 여전히 유지되는지 여부에 관계없이 쉬운 문제 인스턴스를 제거하려고 시도하는 패턴으로 절이 선택되는지 궁금합니다.
Cyker

1
그러나 더 흥미로운 것은 대략 NPC 문제가 없다는 것입니다.
Cyker

1
@Cyker, 당신은 절대적으로 맞습니다. 엄밀히 말하면 확률이 독립적이라는 보장이 없으므로 확률을 곱할 수 없습니다. 그것은 알고리즘이 얼마나 잘 작동하는지 예측하는 휴리스틱입니다. 휴리스틱이 잘못되었을 수 있습니다. 궁극적 인 테스트는 알고리즘을 구현하고 작동하는지 여부를 확인하는 것입니다.
DW

2
한 가지 빠른 테스트는 SAT 솔버에서 인스턴스를 시도하는 것입니다. SAT Solvers가 귀하의 인스턴스에서 효율적이라고 생각하지만 귀하의 사양을 완전히 이해하려고 시도하지 않았습니다. 10000 개의 변수 인스턴스를 생성하고 SAT 솔버를 실행 해보십시오. 그런데 패딩 /
솔팅
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.