Rozważmy masz funkcji skrótu , który trwa ciągi długości i powrót ciągi o długości i ma tę właściwość, piękny, że jest odporna na zderzenia , czyli trudno jest znaleźć dwa różne ciągi z tego samego skrótu .
Chciałbyś teraz zbudować nową funkcję skrótu która pobiera ciągi o dowolnej długości i odwzorowuje je na ciągi o długości , zachowując jednocześnie odporność na kolizje.
Na szczęście już w 1979 r. Opublikowano metodę znaną obecnie jako konstrukcja Merkle – Damgård, która osiąga właśnie to.
Zadaniem tego wyzwania będzie wdrożenie tego algorytmu, dlatego najpierw przejrzymy formalny opis konstrukcji Merkle – Damgård, a następnie przejrzymy krok po kroku przykład, który powinien wykazać, że podejście jest prostsze niż może się na początku pojawić.
Biorąc pod uwagę liczbę całkowitą , funkcję skrótu jak opisano powyżej i ciąg wejściowy o dowolnej długości, nowa funkcja skrótu wykonuje następujące czynności:
- Ustaw , długość i podział na kawałki o długości , w razie potrzeby wypełniając ostatni fragment końcowymi zerami. Daje to wiele kawałków oznaczonych jako.
- Dodaj początkowy i końcowy fragment i , gdzie jest łańcuchem składającym się z zer, a jest binarnie, wypełnione zerami wiodącymi do długości .
- Teraz iteracyjnie zastosuj do bieżącego fragmentu dołączonego do poprzedniego wyniku : , gdzie . (Ten krok może być bardziej wyraźny po zapoznaniu się z poniższym przykładem).
- Wydajność jest wynikiem końcowym .
Zadanie
Napisz program lub funkcję, która przyjmuje na wejściu dodatnią liczbę całkowitą , funkcję skrótu jako czarną skrzynkę i niepuste ciągi i zwraca ten sam wynik co na tych samych wejściach.
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w każdym języku.
Przykład
Powiedzmy, że , więc nasza podana funkcja skrótu przyjmuje łańcuchy o długości 10 i zwraca łańcuchy o długości 5.
- Biorąc pod uwagę , otrzymujemy następujące fragmenty: , , i . Zauważ, że trzeba było uzupełnić do długości 5 jednym końcowym zerem.
- to tylko ciąg pięciu zer, a to pięć cyfr binarnych ( ), wypełnionych dwoma zerami wiodącymi.
- Teraz fragmenty są łączone z :
- jest naszym wyjściem.
Zobaczmy, jak wyglądałoby to wyjście w zależności od niektórych opcji 1 dla :
- Jeśli , tj. zwraca tylko co drugi znak, otrzymujemy:
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!