【发布时间】:2014-02-02 04:26:13
【问题描述】:
我尝试将 HMAC-SHA256 算法编码为函数
HMAC (K,m) = H((K ⊕ opad) ∥ H((K ⊕ ipad) ∥ m))
在哪里
- H 是一个加密哈希函数,
- K 是一个秘密密钥,在散列函数的输入块大小或原始密钥的散列(如果它长于该块大小)的右侧用额外的零填充,
- m是要认证的消息,
- ∥ 表示连接,
- ⊕表示异或(XOR),
- opad 是外部填充(0x5c5c5c…5c5c,一个块长的十六进制常量),
- ipad 是内部填充(0x363636…3636,一个块长的十六进制常量)。
这是我的代码
public static string MyHMACHash(string key , string message)
{
Encoding encoding = Encoding.UTF8;
//var md = System.Security.Cryptography.MD5CryptoServiceProvider.Create();
SHA256 hash = SHA256Managed.Create();
byte[] trans_5C = new byte[32];
byte[] trans_36 = new byte[32];
byte[] b_key = encoding.GetBytes(key);
// TODO: also check if key is to short
if (b_key.Length > 32)
b_key = hash.ComputeHash(b_key);
for (int i = 0; i < 32; i++)
{
trans_5C[i] = 92;
trans_36[i] = 54;
if (i < key.Length)
{
trans_5C[i] ^= b_key[i];
trans_36[i] ^= b_key[i];
}
}
byte[] inner = hash.ComputeHash(trans_36.Concat(encoding.GetBytes(message)).ToArray());
var Fhash = hash.ComputeHash(trans_5C.Concat(inner).ToArray());
StringBuilder sb = new StringBuilder();
foreach (byte b in Fhash)
sb.Append(b.ToString("x2"));
string result = sb.ToString(); // = 9036a1a3f654aefeab426e9f7e17288e
return result;
}
但是当我尝试测试此代码时,结果不符合标准互联网网站上的标准 HMAC-SHA256 散列
【问题讨论】:
-
有什么原因你不使用内置的HMACSHA256 Class?
-
因为我研究过尝试对 KEY 进行一些更改并在我的结果和标准结果之间进行比较,所以我想确保,原则上,我的代码在 make 之前返回结果作为标准我的改变