所有这一切对我来说都是新事物,因此请原谅我的笨拙问题。

我正在尝试逐步找出HMAC。

假设我有以下SHA-1方法:

public static string SHA_1(string input)
{
    SHA1CryptoServiceProvider mySha = new SHA1CryptoServiceProvider();
    string temp = BitConverter.ToString(mySha.ComputeHash(Encoding.UTF8.GetBytes(input)));
    temp = temp.Replace("-", "").ToUpper();
    return temp;
}


它接收纯文本字符串;

假设我的秘密密钥是“”(空字符串),消息也是如此。
HMAC应该是:fbdb1d1b18aa6c08324b7d64b71fb76370690e1d

现在那是我有点迷路的地方。我会按照我的理解写下这些步骤,如果我错了(或者我错了),请纠正我。


如果密钥少于64个字节,则需要用0填充。
因此,填充的密钥为0x00(x64-因为密钥为空,否则为64-key.Length);
每个64个字节长的两个常量是:


ipad = 0x36(x64)

opad = 0x5c(x64)


因为键为空字符串XOR导致opad和ipad相同,即


ipad XOR键= ipad

opad XOR键= opad


此时,剩下要做的就是计算HMAC本身。


因此:HMAC = Hash(opad || Hash(ipad || message))就是这样。

但是我不确定如何执行此操作。
该消息是文本字符串。 opad和ipad是uint / byte数组。我也可以将它们转换为ASCII并分别接收:

ipad_str =“ 6666666666 ...” x64

opad_str =“ \\\\\\\ ....” x64

现在我的HMAC应该是:

HMAC = SHA_1(“ \\\\\\ ....” + SHA_1(“ 6666666 ....”))

但结果不匹配。相反,它是:
4DCF4B8D646EBD77EB704A9240BFA429078131A2

我在这里想念什么?是否也必须填充空消息?
我怀疑我误解了串联,但是我不确定我还有其他选择。我应该将ipad和opad保留为十六进制吗? SHA1方法接收字符串,因此我必须转换为某种字符串,但我无法弄清楚到底是什么类型。

任何帮助将不胜感激。
在此先感谢您,新年快乐!

最佳答案

我的方法的问题是如此明显,甚至不好笑。在附加opad和内部哈希的结果时,我将内部哈希保留为十六进制格式,但将其视为ASCII,结果104个字节被发送到外部哈希而不是84个字节。所以解决方案类似于:HMAC = SHA_1( opad + HexToASCII(SHA_1(ipad)));

10-08 06:33