2016-04-14 2 views
0

本からSHA-256を読みましたが、その本は何のために説明されていませんか?この本は、Javaでそれを作成する方法を説明しました。しかし、私はInteger.toString((byteData[i] & 0xff) + 0x100, 16).substring(1))が何であるか理解できませんでした。誰かが私にそれを詳細に説明することはできますか?SHA-256とは何ですか?そしてそれをJavaでどのように作成するのですか?

enter image description here

+1

https://en.wikipedia.org/wiki/Cryptographic_hash_function#Applications –

+0

SHA-256は、数値を16進数に変換することには関係しません。 –

+1

SHA 256はハッシュアルゴリズムです。しかし、真剣に:もしあなたがそれが何であるか分からなければ、それを忘れる。通常、あるレベルの「セキュリティ」を達成するには、ハッシングと暗号化が必要です。しかし、それは初心者のためのトピックではありません。言い換えれば、そのような話題に関するこのような質問をどうにかすると、他の話題を調べるほうがいいということを意味します。 – GhostCat

答えて

0
Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1)) 

一ワシントン州バイト値を16進数の2進数の文字列に変換します。 String's Javadoc pageを見ると役立ちます。

0x100substring(1)の組み合わせでは、16進数の16進数(つまり16進数の0〜F)のバイト値も2文字で表示されます(<)。ところで

String.format("%02x",byteData[i]) 

は正確に同じことを、特にCのprintf形式のフォーマット文字列に使用されている人々によって、より読みやすいと考えられるかもしれません。

最後に、なぜ(byteData[i] & 0xff)ですか? Javaは 符号拡張を使用して、intへの拡大変換を行いますので、

それは動作しますので、代わりに負のバイトのあなたは、負の int型を持っています。詳しい説明はhereを参照してください。 0xffでマスキングすると、下位8ビットのみが残るため、 は再び正の数になります。

+0

バイトを16進数に変換する例を教えてください。 –

+0

これはまさに「Integer.toString」と「String.format」の両方の提案がしていることなので、私はあなたの質問を理解していませんか? – fvu

+0

これを16進数に変換する方法を理解しましたが、もう1つの質問があります。 &0xffは重要ですか?バイトは常に8ビットに等しくありませんか?それでなぜ8ビットであることを確認する必要がありますか?ありがとう! –

0

SHA-256ハッシュアルゴリズムと呼ばれ、その目的は簡単である:これは、任意のデータを受け取り、それを表現するバイトのユニークなシリーズを生成します。このプロセスを元に戻す方法はなく、一意ではないSHA-256ハッシュの既知のインスタンスはありません。

問題のコード行の目的は、最終的なSHA-256出力の1文字を生成することです。 Javaは、生データ(バイト配列)にhasを与え、通常は16進数に変換して文字列として表現します。そのコード行はかなり複雑なので、私はそれの各部分が別々に何をするかについて説明します。

sb.append();は、入力を受け取り、それをStringBuilderに格納された結果に追加しています。

Integer.toString();番号を受け取り、

byteData[i] & 0xffは、ハッシュデータの現在のバイトを選択し、バイト内の各ビットについて(SOの0xFFを使用してビット単位のAND演算を使用して、0xFFの内の対応するビット場合、文字列リテラルとして表しますない出力が0

string.substring(1);出力文字列が最初の文字の後に開始された場合、出力は、1であり、同じである。

+0

あなたの答えも良いですが、あなたは何が "0x100"なのか説明しませんでした。私はあなたの助けに感謝します。 –

関連する問題