MD5 est de 128 bits mais pourquoi est-il de 32 caractères?

95

J'ai lu des documents sur md5, il a dit que ses 128 bits, mais pourquoi est-ce 32 caractères? Je ne peux pas calculer les caractères.

  • 1 octet équivaut à 8 bits
  • si 1 caractère vaut 1 octet
  • alors 128 bits est 128/8 = 16 octets non?

ÉDITER:

SHA-1 produit 160 bits, alors combien de caractères y a-t-il?

hash_jr90
la source
Pouvez-vous publier un lien vers les documents auxquels vous faites référence?
Don Roby
@don: Désolé, c'est mes notes de conférencier. Mais ba__friend a répondu à ma question, et je la teste ici: miraclesalad.com/webtools/md5.php , et ses caractères vraiment hexadécimaux seulement, cela a beaucoup plus de sens pour moi maintenant. Je voterai sa réponse comme meilleure réponse
hash_jr90
Je pense que ma réponse est plus détaillée à ce sujet que sur d’autres. Si vous êtes nouveau dans la programmation informatique et que vous posez cette question et que vous voulez une réponse
directe
9
Ce n'est pas une question idiote. Il était une fois, vous ne saviez pas non plus combien de caractères HEX représentaient un octet.
David Klempfner
Un rapide python one liner pour calculer la longueur en bits d'un hachage est ((1 << (n*4))-1).bit_length()où n est la longueur du hachage en hexadécimal
Wouterr

Réponses:

107

32 caractères sous forme de représentation hexadécimale, soit 2 caractères par octet.

ba__friend
la source
1
1 octet est représenté par un nombre hexadécimal à deux chiffres, comme 255 = ff.
ba__friend
1
donc 1 octet équivaut à 2 caractères, ce qui signifie que 16 bits correspondent à 2 caractères, puis 128/16 = 8. Donc, 8 caractères sur 2 = 16 caractères sont nécessaires alors? Pourquoi 32?
Koray Tugay
15
Parce que chaque caractère hexadécimal peut être représenté par 4 bits. Donc, si c'est 128 bits, c'est 128/4 = 32 caractères hexadécimaux. Même si chaque "char" sera codé en utf8 ou ascii, ce qui rendra la représentation hexadécimale de 32 * 8 = 256 bits.
Gaston Sanchez
2
C'est une très mauvaise réponse. Ma réponse entre dans les détails à ce sujet: stackoverflow.com/a/41618070/124486
Evan Carroll
@KorayTugay "donc 1 octet correspond à 2 caractères, ce qui signifie que 16 bits correspondent à 2 caractères" - 1 octet! = 16 bits.
David Klempfner
36

Je voulais résumer certaines des réponses dans un seul post.

Tout d'abord, ne considérez pas le hachage MD5 comme une chaîne de caractères mais comme un nombre hexadécimal. Par conséquent, chaque chiffre est un chiffre hexadécimal (0-15 ou 0-F) et représente quatre bits et non huit.

En allant plus loin, un octet ou huit bits sont représentés par deux chiffres hexadécimaux, par exemple b ' 1111 1111' = 0xFF= 255.

Les hachages MD5 ont une longueur de 128 bits et sont généralement représentés par 32 chiffres hexadécimaux.

Les hachages SHA-1 ont une longueur de 160 bits et sont généralement représentés par 40 chiffres hexadécimaux.

Pour la famille SHA-2, je pense que la longueur de hachage peut faire partie d'un ensemble prédéterminé. Ainsi, SHA-512 peut être représenté par 128 chiffres hexadécimaux.

Encore une fois, cet article est simplement basé sur les réponses précédentes.

RepentantFan
la source
26

Un "caractère" hexadécimal (grignotage) est différent d'un "caractère"

Pour être clair sur les bits vs octet, vs caractères.

  • 1 octet équivaut à 8 bits (pour nos besoins)
  • 8 bits offre 2**8des combinaisons possibles: 256 combinaisons

Lorsque vous regardez un caractère hexadécimal,

  • 16 combinaisons de [0-9] + [a-f]: la gamme complète de0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 est inférieur à 256, donc un caractère hexadécimal ne stocke pas d' octet.
  • 16 est 2**4: cela signifie qu'un caractère hexadécimal peut stocker 4 bits dans un octet (un demi-octet).
  • Par conséquent, deux caractères hexadécimaux peuvent stocker 8 bits, des 2**8combinaisons.
  • Un octet représenté par un caractère hexadécimal est [0-9a-f][0-9a-f]et qui représente les deux moitiés d'un octet (nous appelons un demi-octet un quartet ).

Lorsque vous regardez un caractère ordinaire à un octet, (nous allons totalement ignorer les caractères multi-octets et larges ici)

  • Il peut stocker bien plus de 16 combinaisons.
  • Les capacités du caractère sont déterminées par le codage. Par exemple, l' ISO 8859-1 qui stocke un octet entier, stocke tout cela
  • Tout cela prend toute la 2**8gamme.
  • Si un caractère hexadécimal dans un md5()pouvait stocker tout cela, vous verriez toutes les lettres minuscules, toutes les lettres majuscules, toute la ponctuation et des choses comme ¡°ÀÐàð, des espaces comme (nouvelles lignes et tabulations) et des caractères de contrôle (ce que vous pouvez '' t même voir et dont beaucoup ne sont pas utilisés).

Ils sont donc clairement différents et j'espère que cela fournira la meilleure ventilation des différences.

Evan Carroll
la source
1
Que signifie réellement ce "Dans quel ordre dépend réellement des spécifications ou de la plate-forme"? J'adorerais voir cela expliqué un peu plus.
KumarM
@KumarM Je vais supprimer cela parce que je ne pense pas que ce soit vraiment pertinent pour la conversation, et c'est mal formulé.
Evan Carroll
22

MD5 donne des chiffres hexadécimaux (0-15 / 0-F), donc ils sont de quatre bits chacun. 128/4 = 32 caractères.

SHA-1 donne également des chiffres hexadécimaux (0-15 / 0-F), donc 160/4 = 40 caractères.

(Puisqu'il s'agit d'opérations mathématiques, la sortie de la plupart des fonctions de hachage est généralement représentée sous forme de chiffres hexadécimaux.)

Vous pensiez probablement aux caractères de texte ASCII, qui sont de 8 bits.

Wiseguy
la source
merci beaucoup .. j'ai une image beaucoup plus claire dans ma tête maintenant !!
hash_jr90
remarque: ascii-charset contient des symboles non imprimables.
Roy Lee
J'ai essayé de décomposer cela un peu plus explicitement stackoverflow.com/a/41618070/124486
Evan Carroll
9

Cela fait 32 caractères hexadécimaux - 1 caractère hexadécimal correspond à 4 bits.

Brett Thomas
la source
2

Ce sont des chiffres hexadécimaux, pas des caractères. Un chiffre = 4 bits.

eaolson
la source
2

Ce ne sont pas en fait des caractères, ce sont des chiffres hexadécimaux.

Jack Edmonds
la source
2

Un chiffre hexadécimal = 1 quartet (quatre bits)

Deux chiffres hexadécimaux = 1 octet (huit bits)

MD5 = 32 chiffres hexadécimaux

32 chiffres hexadécimaux = 16 octets (32/2)

16 octets = 128 bits (16 * 8)

La même chose s'applique à SHA-1, sauf qu'il comporte 40 chiffres hexadécimaux.

J'espère que ça aide.

Pluie
la source