1

コード 1: (SHA1 の結果を文字列に変換する簡単な方法)

byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
SHA1CryptoServicesProvider x = new SHA1CryptoServicesProvider();
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
   s.Append(b.ToString("x2").ToLower());
result1 = s.ToString();

コード 2: (世界の初めからプロジェクトに存在していたレガシー コード)

byte[] bs = System.Text.ASCIIEncoding.GetBytes(input);
SHA1CryptoServicesProvider x = new SHA1CryptoServicesProvider();
bs = x.ComputeHash(bs);
char[] c = new char[bs.length]
for(int i=0; i<bs.length; i++)
  c[i] = (char)(bs[i] & 0x7f);
resutl2 = new StringBuilder().Append(c).ToString();

で評価するmap()関数はありますか?result1result2

result1 == map(result2)

そして、「コード 2」とは何を意味するの0x7fでしょうか?

4

3 に答える 3

2

そして、「コード 2」の 0x7f は何を意味するのでしょうか?

& 0x7fつまり、「最初の (最下位の) 7 ビットのみを保持する」という手段は& 128、適合しない情報を単純に破棄することによって、出力を純粋な ASCII (ASCII は 7 ビットのみを使用) のままにすることを強制します。

で評価するmap()関数はありますか?result1result2

ただし、最大の問題は、最初に異なるエンコーディングを使用することですinput。ASCII テキスト (つまり、最初の 7 ビットのみが使用される文字) のみが含まれている場合を除き、完全に異なるバイト配列 ( bs) をハッシュしているため、最終的な出力は決して平等ではありません。ハッシュは自明に可逆ではないため、これを補うことはできません。

于 2013-04-10T05:49:04.213 に答える
0

コード 1 では、次のことがわかります。

s.Append(b.ToString("x2").ToLower());

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspxから、バイトの toString("x2") は、各バイトが 2 桁の 16 進数としてレンダリングされてから小文字化されることを意味することがわかります - つまり 0a, f9など

しかし、コード 2 には次のように表示されます。

c[i] = (char)(bs[i] & 0x7f);

実行中 (bs[i] & 0x7f); つまり、8 番目のビットを削除 (0 に設定) してから、戻り値に配置します。元のハッシュに LOST 情報があることを意味します - その約 8 分の 1 が消去されます。つまり、result2 の関数を使用して、result1 がどの関数になるかを判断することはできません。

コード 2 の意図がハッシュを印刷可能な文字列にレンダリングすることである場合、base64 エンコーディングがより良いアイデアです (google it) (もちろん、印刷可能な 16 進エンコーディングも問題ありません)。

また、コード 1 とコード 2 は、最初は異なるエンコーディングを使用します。コード 1/2 に渡された文字列に、純粋な ASCII だけでなく Unicode が含まれている場合、すぐにさまざまなものがハッシュされ、すぐに相容れなくなります。

于 2013-04-10T05:53:17.280 に答える