SHA 散列函数给出负输出

Ego*_*gor 5 java hash sha dsa

我正在尝试实现 DSA 签名算法,但遇到了一个问题。我正在使用java.security MessageDigest该类,这是代码:

MessageDigest md;
md = MessageDigest.getInstance("SHA-1");
md.update(text.getBytes());
return new BigInteger(md.digest());
Run Code Online (Sandbox Code Playgroud)

Text 是一个随机的 String 对象。问题是这段代码给了我散列的负值,这是算法不接受的。难道我做错了什么?提前致谢。

PS顺便说一句,我也尝试过不使用BigIntegers来实现DSA,这可能吗?我没有找到小于 1024 和 160 的 L 和 N 值,所以我不知道我应该取什么值以及我应该使用什么哈希函数。将非常感谢听到这些问题的答案。

Mar*_*aux 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.
Run Code Online (Sandbox Code Playgroud)

然后你可以使用以下方法将哈希值转换为字符串:

String hash = biginteger.toString(16);
Run Code Online (Sandbox Code Playgroud)

然后可以选择在前面添加前导零。

String zeros = String.format("%032d", 0);
hash = zeros.substring(hash.length()) + hash;
Run Code Online (Sandbox Code Playgroud)