문제

SHA-1이 40-0의 16진수 값으로 계산할 입력이 있습니까?"0000000000000000000000000000000000000000"?

도움이 되었습니까?

해결책

나는 그렇게 생각하지 않습니다.

왜 불가능한지 보여주는 쉬운 방법은 없습니다.만약 그렇다면 이것은 충돌을 찾는 알고리즘의 기초가 될 것입니다.

더 긴 분석:

전처리를 통해 항상 최소한 하나의 1 입력에 비트가 있습니다.

루프 오버 w[i] 원래 스트림은 그대로 두므로 입력에 최소한 하나의 1비트(단어 0~15)가 있습니다.비트 패턴을 영리하게 설계하더라도 루프가 영향을 주지 않기 때문에 적어도 0에서 15까지의 값 중 일부는 0이 아니어야 합니다.

메모: leftrotate 원형이므로 1비트도 손실되지 않습니다.

메인 루프에서는 다음 요소가 있음을 쉽게 알 수 있습니다. k 0은 절대 아니므로 temp 오른쪽의 모든 피연산자가 0이므로 0이 될 수 없습니다(k 절대 그렇지 않습니다).

이로 인해 비트 패턴을 생성할 수 있는지 여부에 대한 질문이 남습니다. (a leftrotate 5) + f + e + k + w[i] 합계를 오버플로하여 0을 반환합니다.이를 위해서는 다음의 값을 찾아야 합니다. w[i] 그렇게 w[i] = 0 - ((a leftrotate 5) + f + e + k)

이는 처음 16개 값에 대해 가능합니다. w[i] 왜냐하면 당신은 그들을 완전히 통제할 수 있기 때문입니다.그러나 16부터 79까지의 단어는 다음에 의해 다시 생성됩니다. xor처음 16개 값을 사용합니다.

따라서 다음 단계는 루프를 풀고 선형 방정식 시스템을 만드는 것입니다.나는 그것을 독자들에게 연습으로 남겨두겠습니다 ;-) 안정적인 결과를 얻을 때까지 추가 방정식을 생성하는 루프가 있기 때문에 시스템은 흥미로웠습니다.

기본적으로 알고리즘은 입력 패턴을 선택하여 개별 0 단어를 생성할 수 있는 방식으로 선택되었지만 이러한 효과는 다음과 같이 상쇄됩니다. xor입력 패턴을 사용하여 64개의 다른 입력을 생성합니다.

예를 들면 다음과 같습니다.만들다 temp 0, 우리는

a = h0 = 0x67452301
f = (b and c) or ((not b) and d)
  = (h1 and h2) or ((not h1) and h3)
  = (0xEFCDAB89 & 0x98BADCFE) | (~0x98BADCFE & 0x10325476)
  = 0x98badcfe
e = 0xC3D2E1F0
k = 0x5A827999

이는 우리에게 w[0] = 0x9fb498b3, 등.이 값은 16, 19, 22, 24-25, 27-28, 30-79 단어에 사용됩니다.

마찬가지로 단어 1은 단어 1, 17, 20, 23, 25-26, 28-29, 31-79에서 사용됩니다.

보시다시피 겹치는 부분이 많습니다.결과가 0이 되는 입력 값을 계산하면 해당 값은 마지막으로 32개의 다른 입력 값에 영향을 미칩니다.

다른 팁

그렇습니다. 즉, 2^160 또는 0.000000000000000000000000000000000000000000000000000000000000000000684277657836021%.

또한 SHA1은 암호화 적으로 강력하며 계산적으로 불가능할 것입니다 (적어도 현재 컴퓨터 기술의 경우 - 모든 베팅은 다음과 같은 출현 기술을 위해 꺼져 있습니다. 양자 컴퓨팅) 실제로 어떤 데이터를 찾아서 실제로 발생할 때까지 모든 영역 해시가 발생합니다. 만약 너라면 진짜 "0"해시를 Sentinel로 사용해야합니다. 제작에서 살아남은 적절한 주장 ( "Zero"Hash Sentinel에 대한 해시 입력 데이터만으로는 해당 해시 데이터 만 해당하지 않았 음)을 포함시켜야합니다. 코드가 영구적으로 확인 해야하는 고장 조건입니다. 경고 : 코드는 코드가 영구적으로 파손됩니다.

귀하의 상황에 따라 (논리가 입력을 금지하기 위해 빈 문자열을 특별한 경우에 처리 할 수있는 경우) 빈 문자열의 SHA1 HASH ( 'DA39A3EE5E6B0D325B0D325BFEF95601890AFD80709')를 사용할 수 있습니다. 입력에 숫자 전용이 변하지 않는 경우 SHA1 ( 'A')과 같은 입력 영역에없는 모든 문자열에 해시를 사용하는 것도 가능합니다. 입력이 정기적 인 장식을 추가하기 위해 전처리 된 경우 장식이없는 무언가의 해시가 작동합니다 (예 : 'foo'와 같은 입력이 ' "foo"'와 같은 인용문으로 장식 된 경우 (예 : Sha1 ( 'ABC'). ).

Aaron의 게시물이 잘못되었습니다. Round Function의 끝에서 발생하는 일을 무시하면서 SHA1 계산의 내부에 매달려 있습니다.

구체적으로, 위키 백과의 의사 코드. 라운드가 끝나면 다음 계산이 수행됩니다.

h0 = h0 + a
h1 = h1 + b 
h2 = h2 + c
h3 = h3 + d
h4 = h4 + e

따라서 모든 0 출력이 발생할 수 있습니다 h0 == -a, h1 == -b, h2 == -c, h3 == -d, 그리고 h4 == -e 이 마지막 섹션으로 들어가는 계산은 MOD 2^32입니다.

귀하의 질문에 답하기 위해 : 모든 제로 출력을 생성하는 입력이 있는지는 아무도 모르지만 암호화 작가 예상하다 DAF가 제공 한 간단한 주장에 근거한다.

SHA-1 내부에 대한 지식이 없으면 특정 값이 왜 불가능한 지 알 수 없습니다 (알고리즘 설명에 명시 적으로 언급되지 않는 한). 모든 제로 값은 다른 특정 값보다 더 많은 가능성이 없습니다.

여기의 모든 현재 답변과는 달리 아무도 그것을 모릅니다. 확률 추정과 증거 사이에는 큰 차이가 있습니다.

그러나 당신은 그것이 일어나지 않을 것이라고 안전하게 가정 할 수 있습니다. 실제로, 당신은 거의 모든 값이 결과가 아니라고 가정 할 수 있습니다 (일부 SHA-1 유사 절차를 통해 얻지 못했다고 가정). SHA-1이 안전하다고 가정 할 수 있습니다 (실제로는 더 이상 이론적으로는 더 이상 없음).

사람들은 그것이 얼마나 불가능한 지 깨닫지 못하는 것처럼 보이지 않습니다 (모든 인류가 Bruteforcing에 의해 제로 해시를 찾는 데 현재의 모든 자원에 초점을 맞추면 XXX에 대해 약 해제됩니다.

기능이 안전하다는 것을 알고 있다면, 그것이 일어나지 않을 것이라고 가정하는 것은 잘못이 아닙니다. 미래에 변경 될 수 있으므로 악의적 인 입력이 그 값을 줄 수 있다고 가정합니다 (예 : 해시가없는 경우 사용자의 HDD를 지우지 마십시오).

누군가가 여전히 "깨끗한"것이 아니라고 생각한다면, 양자 역학 때문에 실제 세계에서는 아무것도 보장되지 않는다고 말할 수 있습니다. 당신은 확실하게 낮은 확률로 인해 단단한 벽을 걸을 수 없다고 생각합니다.

나는이 사이트를 끝냈다 ... 여기서 첫 번째 대답, 나는 좋은 대답을 쓰려고 노력했지만, 내가 보는 것은 잘못되었고 그들이 왜 그렇게하는지 그 이유를 말할 수없는 많은 다운 투보적인 모론이다. . 당신의 커뮤니티는 정말 실망했습니다. 나는 여전히이 사이트를 사용하지만 수동적으로 만

여기의 모든 대답과는 달리 답은 단순히 아니요입니다.

해시 값에는 항상 1으로 설정된 비트가 포함되어 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top