gpt4 book ai didi

c# - HMAC 产生错误的结果

转载 作者:行者123 更新时间:2023-11-30 23:31:41 24 4
gpt4 key购买 nike

所有这些对我来说都是新的,所以请原谅我的菜鸟问题。

我正试图逐步找出 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;
}

它接收一个纯文本字符串;

假设我的 key 是“”(空字符串),消息也是;HMAC 应该是:fbdb1d1b18aa6c08324b7d64b71fb76370690e1d

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

  1. 如果 key 短于 64 字节,我需要用 0 填充它。所以填充的key是0x00(x64——因为key是空的,否则就是64-key.Length);
  2. 两个 64 字节长的常量是:

iPad = 0x36 (x64)

运算符 = 0x5c (x64)

  1. 因为key是空串异或结果是同一个opad和ipad,即

ipad 异或 key = ipad

opad 异或键 = opad

  1. 此时剩下要做的就是计算 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)));

关于c# - HMAC 产生错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34522863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com