我有一把钥匙:

byte: 0011100101010111000101111100101101100010100010111001010010000000


一个消息:

byte: 10110001


hmac输出为十六进制:

HMAC-SHA256:    ca3871e40207fc0cd66558e4e4fa2817d283da605c15e4c941ff7945ad4be29f


因此,如果我创建一个新的BigInteger(测试),例如:

BigInteger test = new BigInteger(hmac);


如果我想像这样返回十六进制值:

System.out.println("\noutput: " + test.toString(16));


我得到这个:

output: -35c78e1bfdf803f3299aa71b1b05d7e82d7c259fa3ea1b36be0086ba52b41d61


问题出在哪里?或者如何从消息中计算出hmac-sha256并从一开始就使用BigIntegers。

key,message和hmac是字节数组。

如果我尝试将字节“ 11010100”转换为BigInteger,它将转换为负数“ -101100”
为什么BigInteger会将其转换为负数?第一位是符号位,如何禁用符号位?

最佳答案

有一个BigInteger构造函数,用于分别设置符号和大小,而不是期望2s补码位串的默认值。请参见here

例:

Bmsg[i] = new BigInteger(1, msg[i]);

关于java - BigInteger HMAC转换异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17317506/

10-13 03:28