당신이이 고려 해시 함수 길이의 문자열 소요 길이의 반환 문자열 하고 있다는 좋은 속성이 방지 충돌 , 즉 찾기 어려운 두 개의 서로 다른 문자열 같은 해시와 .
이제 임의의 길이의 문자열을 가져 와서 길이가 n 인 문자열에 매핑 하는 새로운 해시 함수 를 만들고 싶습니다 .
운 좋게도, 이미 1979 년에 머클-담 가르드 구조 로 알려진 방법 이 발표되었습니다.
이 과제의 과제는이 알고리즘을 구현하는 것이므로 먼저 Merkle-Damgård 구성에 대한 공식적인 설명을 살펴보면서 접근 방식이보다 단순하다는 것을 보여주는 단계별 예제를 살펴 봅니다. 처음에 나타날 수 있습니다.
정수 , 위에서 설명한 해시 함수 및 임의 길이 입력 문자열 s 가 주어지면 새 해시 함수 는 다음을 수행합니다.
- 설정 ,의 길이 , 및 분할 길이의 덩어리에서 과 마지막 덩어리를 채우고, 후행 필요한 경우 0을. 이것은 m = ⌈ l을 산출합니다표지 많은 청크.
- 선행 및 후행 청크 및 . 여기서 은 0 으로 구성된 문자열 이고 은 2의 이며 선행 0은 길이 까지 채워집니다 .
- Now iteratively apply to the current chunk appended to the previous result : , where . (This step might be more clear after looking at the example below.)
- The output of is the final result .
The Task
양의 정수 , 해시 함수 , 블랙 박스 및 비어 있지 않은 문자열 입력으로 사용하고 동일한 입력에서 와 동일한 결과를 반환 하는 프로그램 또는 함수를 작성하십시오 .
이것은 code-golf 이므로 각 언어에서 가장 짧은 답변이 이깁니다.
예
라고 가정 하면 주어진 해시 함수 는 길이가 10 인 문자열을 취하고 길이가 5 인 문자열을 반환합니다.
- Given an input of , we get the following chunks: , , and . Note that needed to be padded to length 5 with one trailing zero.
- is just a string of five zeros and is five in binary (), padded with two leading zeros.
- Now the chunks are combined with :
- is our output.
Let's have a look how this output would look depending on some choices1 for :
- If , i.e. just returns every second character, we get:
So needs to be the output if such a is given as black box function. - If simply returns the first 5 chars of its input, the output of is . Similarly if returns the last 5 chars, the output is .
- If multiplies the character codes of its input and returns the first five digits of this number, e.g. , then .
1 For simplicity, those are actually not collision resistant, though this does not matter for testing your submission.
omgPzzles0
. Well chosen example input!