MD5 ist 128 Bit, aber warum sind es 32 Zeichen?

89

Ich habe einige Dokumente über md5 gelesen, es heißt, dass es 128 Bit sind, aber warum sind es 32 Zeichen? Ich kann die Zeichen nicht berechnen.

  • 1 Byte ist 8 Bit
  • wenn 1 Zeichen 1 Byte ist
  • dann sind 128 Bit 128/8 = 16 Bytes, oder?

BEARBEITEN:

SHA-1 erzeugt 160 Bit. Wie viele Zeichen gibt es also?

hash_jr90
quelle
Können Sie einen Link zu den Dokumenten veröffentlichen, auf die Sie verweisen?
Don Roby
@don: Sorry, es ist mein Dozent Notizen. Aber ba__friend hat meine Frage beantwortet und ich teste sie hier: miraclesalad.com/webtools/md5.php , und nur seine wirklich hexadezimalen Zeichen, es macht jetzt viel mehr Sinn für mich. Ich werde seine Antwort als beste Antwort
wählen
Ich denke, meine Antwort geht darauf detaillierter ein als alle anderen. Wenn Sie neu in der Computerprogrammierung sind und diese Frage stellen und eine durchgehende Antwort wünschen
Evan Carroll
9
Es ist keine dumme Frage. Es war einmal, Sie wussten auch nicht, wie viele HEX-Zeichen ein Byte darstellen.
David Klempfner
Ein schneller Python-One-Liner zur Berechnung der Bitlänge eines Hashs ist, ((1 << (n*4))-1).bit_length()wobei n die Länge des
Hashs

Antworten:

105

32 Zeichen als hexadezimale Darstellung, das sind 2 Zeichen pro Byte.

Freund
quelle
1
1 Byte wird durch eine zweistellige Hexadezimalzahl dargestellt, z. B. 255 = ff.
Freund am
1 Byte ist also 2 Zeichen, was bedeutet, dass 16 Bit 2 Zeichen sind, dann 128/16 = 8. Also sind dann 8 von 2 Zeichen = 16 Zeichen erforderlich? Warum 32?
Koray Tugay
14
Weil jedes Hex-Zeichen durch 4 Bits dargestellt werden kann. Wenn es also 128 Bit sind, sind es 128/4 = 32 Hex-Zeichen. Obwohl jedes "char" als utf8 oder ascii codiert wird, ergibt sich für die hexadezimale Darstellung eine Größe von 32 * 8 = 256 Bit.
Gaston Sanchez
2
Dies ist eine wirklich schlechte Antwort. Meine Antwort geht auf Details dazu ein: stackoverflow.com/a/41618070/124486
Evan Carroll
@KorayTugay "1 Byte ist also 2 Zeichen, was bedeutet, dass 16 Bit 2 Zeichen sind" - 1 Byte! = 16 Bit.
David Klempfner
35

Ich wollte einige der Antworten in einem Beitrag zusammenfassen.

Stellen Sie sich den MD5-Hash zunächst nicht als Zeichenfolge vor, sondern als Hex-Zahl. Daher ist jede Ziffer eine hexadezimale Ziffer (0-15 oder 0-F) und repräsentiert vier Bits, nicht acht.

Wenn man das weiter nimmt, werden ein Byte oder acht Bits durch zwei hexadezimale Ziffern dargestellt, z. B. b ' 1111 1111' = 0xFF= 255.

MD5-Hashes sind 128 Bit lang und werden im Allgemeinen durch 32 hexadezimale Ziffern dargestellt.

SHA-1-Hashes sind 160 Bit lang und werden im Allgemeinen durch 40 hexadezimale Ziffern dargestellt.

Für die SHA-2-Familie kann die Hash-Länge eine vorgegebene Menge sein. So kann SHA-512 durch 128 hexadezimale Ziffern dargestellt werden.

Auch dieser Beitrag basiert nur auf vorherigen Antworten.

RepentantFan
quelle
25

Ein hexadezimales "Zeichen" (Knabbern) unterscheidet sich von einem "Zeichen"

Um die Bits gegen Byte und Zeichen klar zu machen.

  • 1 Byte ist 8 Bit (für unsere Zwecke)
  • 8 Bit bieten 2**8mögliche Kombinationen: 256 Kombinationen

Wenn Sie sich ein Hex-Zeichen ansehen ,

  • 16 Kombinationen von [0-9] + [a-f]: der gesamten Palette von0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16 ist weniger als 256, so dass man einen Hex - Zeichen ist nicht ein Byte speichern.
  • 16 ist 2**4: Das bedeutet, dass ein Hex-Zeichen 4 Bits in einem Byte (ein halbes Byte) speichern kann.
  • Daher können zwei Hex-Zeichen 8 Bit- 2**8Kombinationen speichern .
  • Ein als Hex-Zeichen [0-9a-f][0-9a-f]dargestelltes Byte ist und das repräsentiert beide Hälften eines Bytes (wir nennen ein halbes Byte ein Halbbyte ).

Wenn Sie sich ein reguläres Einzelbyte-Zeichen ansehen (wir werden hier ganz auf Mehrbyte- und Breitzeichen verzichten).

  • Es können weit mehr als 16 Kombinationen gespeichert werden.
  • Die Fähigkeiten des Zeichens werden durch die Codierung bestimmt. Zum Beispiel speichert die ISO 8859-1, die ein ganzes Byte speichert, all dieses Zeug
  • All das Zeug nimmt die gesamte 2**8Reichweite ein.
  • Wenn ein Hex-Zeichen in einem md5()all das speichern könnte, würden Sie alle Kleinbuchstaben, alle Großbuchstaben, alle Satzzeichen und Dinge wie ¡°ÀÐàðLeerzeichen (Zeilenumbrüche und Tabulatoren) und Steuerzeichen (die Sie können) sehen. Ich sehe nicht einmal und viele davon werden nicht verwendet.

Sie sind also eindeutig unterschiedlich und ich hoffe, dass dies die beste Aufschlüsselung der Unterschiede bietet.

Evan Carroll
quelle
1
Was bedeutet dies "In welcher Reihenfolge ist die Spezifikation oder Plattform tatsächlich abhängig"? Würde gerne sehen, dass dies ein bisschen mehr erklärt wird.
KumarM
@KumarM Ich werde das löschen, weil ich nicht denke, dass es für das Gespräch überhaupt relevant ist und es schlecht formuliert ist.
Evan Carroll
22

MD5 liefert hexadezimale Ziffern (0-15 / 0-F), also sind es jeweils vier Bits. 128/4 = 32 Zeichen.

SHA-1 liefert auch hexadezimale Ziffern (0-15 / 0-F), also 160/4 = 40 Zeichen.

(Da es sich um mathematische Operationen handelt, wird die Ausgabe der meisten Hashing-Funktionen üblicherweise als Hex-Ziffern dargestellt.)

Sie haben wahrscheinlich an ASCII-Textzeichen gedacht, die 8 Bit umfassen.

Klugscheißer
quelle
Vielen Dank. Ich habe jetzt ein viel klareres Bild in meinem Kopf!
hash_jr90
Hinweis: ASCII-Zeichensatz enthält nicht druckbare Symbole.
Roy Lee
Ich habe versucht, dies etwas expliziter aufzuschlüsseln stackoverflow.com/a/41618070/124486
Evan Carroll
8

Das sind 32 Hex-Zeichen - 1 Hex-Zeichen ist 4 Bit.

Brett Thomas
quelle
2

Dies sind hexadezimale Ziffern, keine Zeichen. Eine Ziffer = 4 Bits.

eaolson
quelle
2

Sie sind eigentlich keine Zeichen, sondern hexadezimale Ziffern.

Jack Edmonds
quelle
2

Eine hexadezimale Ziffer = 1 Halbbyte (vier Bits)

Zwei hexadezimale Ziffern = 1 Byte (acht Bit)

MD5 = 32 hexadezimale Ziffern

32 hexadezimale Ziffern = 16 Bytes (32/2)

16 Bytes = 128 Bits (16 * 8)

Gleiches gilt für SHA-1, außer dass es 40 hexadezimale Ziffern lang ist.

Ich hoffe das hilft.

Regen
quelle