问题描述
|
我正在尝试实现DSA签名算法,但遇到了问题。我正在使用
java.security
MessageDigest
类,这是代码:
MessageDigest md;
md = MessageDigest.getInstance(\"SHA-1\");
md.update(text.getBytes());
return new BigInteger(md.digest());
文本是一个随机的String对象。问题在于此代码给我带来了哈希值的负值,该值未被算法接受。难道我做错了什么?提前致谢。
附言顺便说一句,我也尝试不使用BigIntegers来实现DSA,这可能吗?我没有找到小于1024和160的L和N值,所以我不知道应该采用什么值以及应该使用哪种哈希函数。听到这些问题的答案将非常感激。
解决方法
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;
, 你为什么惊讶? “ 6”返回均匀分布的160位数据。它们通常用十六进制字符串表示,但是如果将它们转换为整数,则最高有效位表示符号。查看以下代码:
System.out.println(new BigInteger(new byte[]{(byte) 255})); //-1
, 您正在将返回的字节传递给BigInteger
构造函数。类型匹配时,我不确定您要在这里完成什么。从BigInteger
JavaDoc:
翻译包含BigInteger的二进制补码二进制表示形式的字节数组
, 不要重新发明轮子,尤其是要使用密码术-使用ѭ10或更高级的库。