2010-12-12 5 views
9

SHA-256の定義は、単一の「1」ビットからなる入力が「01」バイトのものとは明確に異なる明確なハッシュ値を持つように見えます(パディングは入力の長さ(ビット単位)。単一の "1"ビットのSHA-256ハッシュとは何ですか?

しかし、エンドエンディアンの問題と、サポートが1ビットでサポートを見つけることができないという事実のため、この正しい値が何であるかはわかりません。

1ビット長の入力の正しいハッシュは、ビット "1"から構成されていますか? (8ビット長のバイト[] {1}の入力ではありません)。

+1

なぜ???????????? –

+1

あなたはそれを手で計算することができます:http://en.wikipedia.org/wiki/SHA-2#SHA-256_.28a_SHA-2_variant.29_pseudocodeしかし、それはかなり退屈なかなり高速になるでしょう。 – MatrixFrog

+3

@ダン:どうして???????????? –

答えて

8

OK:標準文書は非常にわかりやすいパディングを説明

1ビット列 "1"

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

1ビット列「0 "

BD4F9E98 BEB68C6E AD3243B1 B4C7FED7 5FA4FEAA B1F84795 CBD8A986 76A2A375 

私はこの実装をテストしました。 n 0ビットの文字列を含むいくつかの標準倍数の8ビット入力。結果は正しいものでした。

(もちろん、この質問のポイントが最初の場所で上記の出力を検証するため、注意して使用することでした...)

+1

これらの値を確認します。私のSHA-2の実装はsphlib(http://www.saphir2.com/sphlib/)からのものです。 Cコードは、8の倍数ではない長さの入力を処理します。 –

+0

ありがとうございます@トーマス、私はこれを受け入れてマークします。 –

+0

バイナリエンコーディングで文字列を受け付けるPerlの実装でも確認されています。 –

2

質問が正しく理解されているかどうかわかりません。

SHA-256は、64バイト(= 512ビット)のブロックサイズで動作します。これは、より小さい入力を最初に埋め込まなければならないことを意味します。埋め込みの結果は、次のようになります。

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

この結果は異なるので、次の圧縮関数の結果も同様になります。したがって、ハッシュ値はです。私自身の実装によると、http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf

+0

SHA-256だけでなく、小さな入力をパッドしたり繰り返さないアルゴリズムは考えられません。 –

+1

SHA256のブロックサイズは256ビットではなく512ビットです。 RFC:4634「US Secure Hash Algorithms(SHA and HMAC-SHA)」、http://www.ietf.org/rfc/rfc4634.txtを参照してください。 –

2

データのハッシュを計算するRFC 4634section 8で利用可能なCのコードがありますこれは必ずしも8ビットの倍数ではありません。名前がSHA*FinalBits(...)のメソッドを参照してください。