Considérez que vous avez une fonction de hachage qui prend des chaînes de longueur et renvoie des chaînes de longueur et a la belle propriété d'être résistante aux collisions , c'est-à-dire qu'il est difficile de trouver deux chaînes différentes avec le même hachage .
Vous souhaitez maintenant construire une nouvelle fonction de hachage qui prend des chaînes de longueur arbitraire et les mappe sur des chaînes de longueur , tout en étant résistant aux collisions.
Heureusement pour vous, déjà en 1979, une méthode maintenant connue sous le nom de construction Merkle – Damgård a été publiée et permet d'atteindre exactement ce résultat.
La tâche de ce défi sera d'implémenter cet algorithme, nous allons donc d'abord regarder une description formelle de la construction Merkle – Damgård, avant de passer par un exemple étape par étape qui devrait montrer que l'approche est plus simple que cela pourrait apparaître au premier abord.
Étant donné un entier , une fonction de hachage comme décrit ci-dessus et une chaîne d'entrée de longueur arbitraire, la nouvelle fonction de hachage fait ce qui suit:
- Réglez , la longueur de , et fractionnez en morceaux de longueur , remplissant le dernier morceau avec des zéros de fin si nécessaire. Cela donne nombreux morceaux étiquetés.
- Ajoutez un morceau de tête et un morceau de fin et , où est une chaîne composée de zéros et est en binaire, avec des zéros non significatifs à la longueur .
- Appliquons maintenant de manière itérative au morceau courant ajouté au résultat précédent : , où . (Cette étape pourrait être plus claire après avoir examiné l'exemple ci-dessous.)
- La sortie de est le résultat final .
La tâche
Ecrivez un programme ou une fonction qui prend en entrée un entier positif , une fonction de hachage comme boîte noire et une chaîne non vide et renvoie le même résultat que sur les mêmes entrées.
Il s'agit de code-golf , donc la réponse la plus courte dans chaque langue l'emporte.
Exemple
Disons que , notre fonction de hachage donnée prend des chaînes de longueur 10 et renvoie des chaînes de longueur 5.
- Étant donné une entrée de , nous obtenons les morceaux suivants: , , et . Notez que devait être complété à la longueur 5 avec un zéro à la fin.
- est juste une chaîne de cinq zéros et est cinq en binaire ( ), complété par deux zéros non significatifs.
- Maintenant, les morceaux sont combinés avec :
- 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!