5

DSA署名アルゴリズムを実装しようとしていますが、問題が発生し続けています。私はjava.security MessageDigestクラスを使用しています。コードは次のとおりです。

MessageDigest md;
md = MessageDigest.getInstance("SHA-1");
md.update(text.getBytes());
return new BigInteger(md.digest());

テキストはランダムな文字列オブジェクトです。問題は、このコードがハッシュの負の値を与えることです。これはアルゴリズムによって受け入れられません。私は何か間違ったことをしていますか?前もって感謝します。

PSちなみに、BigIntegersを使用せずにDSAを実装しようとしましたが、これは可能ですか?LとNの値が1024と160未満であることがわからないため、どの値を使用する必要があり、どのハッシュ関数を使用する必要があるのか​​わかりません。これらの質問に対する答えを聞いて非常に感謝します。

4

4 に答える 4

3
MessageDigest md;
md = MessageDigest.getInstance("SHA-1");
md.update(text.getBytes());
return new BigInteger(1, md.digest()); // use this 1 to tell it is positive.

次に、以下を使用してハッシュを文字列に変換できます。

String hash = biginteger.toString(16);

次に、オプションで先行ゼロを付加します。

String zeros = String.format("%032d", 0);
hash = zeros.substring(hash.length()) + hash;
于 2011-06-15T11:56:18.147 に答える
3

なぜあなたは驚いていますか?MessageDigest#digest()均等に分散された160ビットのデータを返します。これらは通常、16進文字列として表されますが、整数に変換すると、最上位ビットが符号を示します。このコードをチェックしてください:

System.out.println(new BigInteger(new byte[]{(byte) 255}));  //-1
于 2011-06-15T11:57:38.537 に答える
1

BigInteger コンストラクターに返されたバイトを渡します。タイプは一致しますが、ここで何を達成したいかわかりません。BigIntegerJavaDocから:

BigIntegerの2の補数のバイナリ表現を含むバイト配列を変換します

于 2011-06-15T11:56:58.043 に答える
0

特に暗号化のために、車輪の再発明をしないでください-使用java.security.Signatureまたはより高いレベルのライブラリ。

于 2011-06-15T12:03:31.370 に答える