Comment trouver multiplicateur x si x * c1 = c2, mais x * c1 causes de dépassement

0

La question

Je suis en train d'écrire un code qui permettra de trouver des collisions std::hash<std::string> et en essayant de renverser certains de hachage des étapes de calcul.

Il y a une telle multiplication dans std::hash la mise en œuvre.

size_t hash2 = shift_mix(hash1) * mul;

Je sais hash2 - à partir de l'étape précédente, je sais aussi mul - c'est la valeur de la constante = 0xc6a4a7935bd1e995UL.

shift_mix(hash1) * mul les causes de dépassement (hash2 / mul = 0), il ne prend que 64 derniers bits de la multiplication résultat.

Donc, j'ai besoin d'un moyen de trouver de nombreuses variantes de shift_mix(hash1) qui satisfont l'égalité. Quelle est la meilleure façon de le faire? Probablement une certaine façon utiliser __int128_t?

c++ hash stdhash
2021-11-23 19:31:15
1

La meilleure réponse

2

La Multiplication par un nombre impair modulo une puissance de deux est inversible, de sorte que vous pouvez "annuler" parfaitement, sans de multiples options qui apparaissent. Cependant, la division ne fonctionne pas après l'emballage, vous devez multiplier par l'inverse multiplicatif de mul mod 264, qui est 0x5f7a0ea7e59b19bd dans ce cas. 0x5f7a0ea7e59b19bd * 0xc6a4a7935bd1e995 = 1.

uint64_t mul_inv = 0x5f7a0ea7e59b19bd;
uint64_t hash1 = unshift_mix(hash2 * mul_inv);
2021-11-23 19:41:58

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................