2010-12-12 5 views
9

Die Definition von SHA-256 scheint so zu sein, dass die Eingabe, die aus einem einzelnen "1" -Bit besteht, einen wohldefinierten Hash-Wert hat, der sich von dem des "01" Bytes unterscheidet (da das Padding auf Basis von Eingabe Länge in Bits).Was ist der SHA-256 Hash eines einzelnen "1" Bits?

Aufgrund von Endianness-Problemen und der Tatsache, dass keine Implementierungen, die ich finden kann, die Unterstützung in einzelnen Bits finden, kann ich nicht ganz herausfinden, was dieser korrekte Wert ist.

Also, was ist der korrekte Hash der 1-Bit langen Eingang bestehend aus dem Bit "1"? (nicht die 8-Bit-lange Byte [] {1} Eingabe).

+1

warum ???????????? –

+1

Sie könnten es von Hand berechnen: http://en.wikipedia.org/wiki/SHA-2#SHA-256_.28a_SHA-2_variant.29_pseudocode, aber es würde ziemlich schnell langweilig werden. – MatrixFrog

+3

@dan: warum nicht ???????????? –

Antwort

8

OK, nach meiner eigenen Implementierung:

1-Bit-String "1":

B9DEBF7D 52F36E64 68A54817 C1FA0711 66C3A63D 384850E1 575B42F7 02DC5AA1 

1-Bit-String „0 ":

BD4F9E98 BEB68C6E AD3243B1 B4C7FED7 5FA4FEAA B1F84795 CBD8A986 76A2A375 

ich habe diese Implementierung o getestet n mehrere Standard-Mehrfach-8-Bit-Eingänge, einschließlich der 0-Bit-Zeichenfolge, und die Ergebnisse waren korrekt.

(selbstverständlich der Sinn dieser Frage wurde die obigen Ausgänge in erster Linie zu validieren, so vorsichtig verwenden ...)

+1

Ich bestätige diese Werte. Meine eigene Implementierung von SHA-2 ist von Sphlib (http://www.saphir2.com/sphlib/). Der C-Code behandelt Eingänge mit Längen nicht multiple von 8. –

+0

Danke @Thomas, ich werde das dann akzeptiert akzeptieren. –

+0

Auch von Perls Implementierung bestätigt, die Zeichenfolgen in Binärcodierung akzeptiert. –

2

Nicht sicher, ob ich Ihre Frage richtig verstanden habe.

SHA-256 arbeitet mit Blockgrößen von 64 Byte (= 512 Bit). Dies bedeutet, dass kleinere Eingänge zuerst aufgefüllt werden müssen. Das Ergebnis der Polsterung sieht wie folgt aus:

For Bit 1: 1100000000000...00000000001 
For Bits 01: 0110000000000...00000000010 

Da diese Ergebnisse eindeutig sind die Ergebnisse der folgenden Komprimierungsfunktionen sein. Und deshalb sind die Hash-Werte. Das Standard-Dokument erklärt die Polsterung ziemlich beschreibend: http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf

+0

nicht nur SHA-256, ich kann nicht an einen Algorithmus denken, der nicht kleine Eingaben packt oder wiederholt. –

+1

Die Blockgröße für SHA256 ist 512 Bit, nicht 256 Bit. Siehe RFC: 4634 "Sichere US-Hash-Algorithmen (SHA und HMAC-SHA)", http://www.ietf.org/rfc/rfc4634.txt –

2

Es-C-Code in section 8 von RFC 4634 ist, den Hash-Wert von Daten zu berechnen, das ist nicht notwendigerweise ein Vielfaches von 8 Bits. Siehe die Methoden, deren Namen SHA*FinalBits(...) lauten.