2

編集:申し訳ありませんが、実装されたsha512 cryptを使用していません。これは、ハッシュを計算するためのソルト値や指定されたラウンド数が含まれていないことがわかるためです。

さて、私はc#でsha-512 cryptをコーディングしていて、ここにある手順に従っています...

http://people.redhat.com/drepper/SHA-crypt.txt

暗号化に関連することを行うのはこれが初めてなので、手順を正しく理解していることを確認したいと思います... cからc#への変換を指示するのに十分なcコードを理解していません:/

ダイジェストを終了することは、ハッシュを計算することと同じだと思います。この場合、ステップが完成したダイジェストを参照する場合、ハッシュ前の計算されたダイジェストバイトではなく、計算されたハッシュを参照していると仮定しました。私が間違っていたら訂正してください!

ステップ1〜8ですべてが正しく行われたと仮定すると、私の疑問はステップ9から始まります。

9.パスワード文字列の32バイトまたは64バイトのブロックごとに(C表現の終了NULを除く)、ダイジェストBをダイジェストAに追加します。

SHA-512を使用しているので、ブロックサイズは64バイトです。

次のコードは望ましい結果を生み出しますか?

//FYI, temp = digestA from steps 1-3 (before expanding digestA for step 9)
//alt_result = computed digestB hash (64 byte hash)

for (cnt = key.Length; cnt > 64; cnt -= 64)                         //9
{
    int i = 0;
    ctx.TransformBlock(alt_result, 0, 64, digestA, temp.Length + 64 * i);
    i++;
}

私が言ったことが正しいことを誰かが明確にできるなら、私はそれをいただければ幸いです。ありがとう!

4

2 に答える 2

3

後でこれに遭遇する可能性のある他の人のために、いくつかの重要な説明を追加します。

まず、SHA512とSHA512Cryptは、2つの異なる目的のための2つの異なるアルゴリズムです。SHA512は汎用ハッシュアルゴリズムです(これを参照)。SHA512Cryptは、パスワードストレージまたはパスワードベースのキー導出アルゴリズムであり、内部でSHA512(ハッシュ)を使用します(これを参照)。SHA512Cryptは、SHA512の代わりにMD5を使用していた以前のCrypt関数に基づいています。

パスワードストレージ/キー生成アルゴリズムは、ブルートフォースに対して桁違いにコストがかかるように特別に作成されています。これを行う一般的な方法は、基礎となるハッシュアルゴリズムを何らかの方法で反復することです。しかし、あなたは自分でこれをしたくありません...それは私たちを...

2番目: 独自の暗号化メソッドを作成しないでください。(これを参照)自分が何をしているのかを正確に知っている場合でも、それを台無しにする方法はたくさんあります。

SHA1に基づいているために組み込みのRfc2898DerviceBytesを使用したくない場合は、bcryptまたはその他の公開されている既知の暗号化アルゴリズムの実装を確認できます。

于 2013-02-04T21:05:01.307 に答える
3

ソルトは、入力文字列の最後に固定バイト文字列を追加するのと同じくらい簡単です。基本的に、既知の「自家製」変換を入力に提供します。

アルゴリズム自体について:あなたは不利な立場から始めているようです。新生児、あなたは明確化さえ必要とする基本的な暗号化用語について多くの「仮定」をしている。CLRの実装がうまくいかない場合は、適切なCの実装を見つけて、それに統合する方法を考え出すことに時間を費やしたほうがよいと思います。それに対する相互運用(外部)呼び出しを理解することは、暗号化の内部に飛び込むよりもはるかに簡単であり、結果はより効率的になり、ネイティブ相互運用について得た知識ははるかに有用/再利用可能になります。

于 2011-10-21T16:09:47.207 に答える