OVH Cloud OVH Cloud

CRC32 a rebours

3 réponses
Avatar
octane
Bonjour,

un CRC32 se calcule a partir d'un tableau et d'un nombre?
function crc(bit array bitString[1..len], int polynomial)

admettons que j'ai le array, le int polynomial, le nombre de caracteres
en entree et le resultat, puis-je remonter a la valeur des caracteres
en entree?

en gros, j'ai:
crc32(xxxxxx)=986A48BE
le polynomial = 0x00FFFFFF

est il possible de retrouver les 6 'x' ?
Il y a une methode intelligente ou le bruteforce est la solution?

Merci

3 réponses

Avatar
Christophe HENRY

un CRC32 se calcule a partir d'un tableau et d'un nombre? function crc(bit
array bitString[1..len], int polynomial)

admettons que j'ai le array, le int polynomial, le nombre de caractères
en entrée et le résultat, puis-je remonter a la valeur des caractères
en entrée?


Aucune possibilité de retrouver de façon certaine la donnée d'origine.
Tout au plus tu peux retrouver des collisions : des données en entrée
résultant en le même CRC.

D'une façon générale, le calcul du CRC est à ranger dans les fonctions
de hachage à sens unique. A l'instar de MD5 ou de SHA, la somme de
contrôle est obtenue par des calculs qu'on ne peut inverser pour
retrouver la donnée originale. Le CRC a une taille unique en sortie,
pourtant on peut le calculer sur des données de taille variable. S'il
était possible de faire le calcul à l'envers, cela voudrait dire qu'il y
a une correspondance exacte (une bijection) entre une donnée et sa somme.
Impossible à obtenir avec des données de tailles différente.

Voici un exemple simple mettant en évidence l'impossibilité concrète de
remonter en arrière :

En guise de somme de contrôle on compte le nombre de bit d'un octet, d'un
mot, d'un Ko. Si le nombre est pair, le résultat est 0, sinon 1. Cette
fonction renvoie donc un bit.
On se rapproche - de loin et par temps de brouillard - du principe du CRC.
Il est évident qu'un bit ne contient pas la même quantité d'information
que la donnée d'origine ; par là, il n'est pas possible de retrouver la
donnée ayant une somme de contrôle à 0 ou 1.
Le problème est plus compliqué mais identique sur ce point avec le CRC.

--
Christophe HENRY
(sans lkm)
GnuPG : 3922239E60036EC86BF7268A877C52AC 4883C02A

Avatar
johann.d
"Christophe HENRY" a écrit dans le
message de news:

Aucune possibilité de retrouver de façon certaine la donnée d'origine.
Tout au plus tu peux retrouver des collisions : des données en entrée
résultant en le même CRC.


Si je ne m'abuse l'OP cherchait un antécédent sur 3 octets (6 'x' dans son
vocabulaire). Si c'est bien cela le sujet avait déjà été abordé ici :
http://groups.google.fr/group/fr.misc.cryptologie/browse_thread/thread/fc9b6356f97dc629/329846f0da774799

--
Johann

Avatar
Sylvain
johann.d wrote on 09/05/2006 23:05:
"Christophe HENRY" a écrit dans le
message de news:

Aucune possibilité de retrouver de façon certaine la donnée d'origine.
Tout au plus tu peux retrouver des collisions : des données en entrée
résultant en le même CRC.


Si je ne m'abuse l'OP cherchait un antécédent sur 3 octets (6 'x' dans son
vocabulaire). Si c'est bien cela le sujet avait déjà été abordé ici :
http://groups.google.fr/group/fr.misc.cryptologie/browse_thread/thread/fc9b6356f97dc629/329846f0da774799



en fait sur 6 octets dans [0-9]u[A-Z]u[a-z] - tel qu'il a exprimé sur
fr.comp.os.unix

la cardinalité des entrées est (en gros) 13 fois celle des CRC
possibles, donc il y aura des collisions et corollairement il ne peut
déterminer de manière unique et certaine le message d'origine.

reste que le post de Thomas Pornin dans le thread cité nous rappellais
bien la linéarité des algos CRC et donc les "inversabilité" ... pour
donner ici plusieurs solutions.

Sylvain.