gpt4 book ai didi

C# System.Security.Cryptography.HMACSHA1.ComputeHash() 不返回预期结果

转载 作者:太空狗 更新时间:2023-10-29 20:05:39 26 4
gpt4 key购买 nike

我正在尝试基于 RFC 4226 在 C# 中实现 OTP 解决方案:https://www.rfc-editor.org/rfc/rfc4226

我找到了一个示例实现,它看起来像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace OTP
{
class Program
{
static void Main(string[] args)
{
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] secretKey = encoding.GetBytes("12345678901234567890");
byte[] counter = encoding.GetBytes("1");
Console.WriteLine(CalculateHotp(secretKey, counter));
Console.ReadKey();
}

public static int CalculateHotp(byte[] key, byte[] counter)
{
var hmacsha1 = new HMACSHA1(key);
byte[] hmac_result = hmacsha1.ComputeHash(counter);
int offset = hmac_result[19] & 0x0f;
int bin_code = (hmac_result[offset] & 0x7f) << 24
| (hmac_result[offset + 1] & 0xff) << 16
| (hmac_result[offset + 2] & 0xff) << 8
| (hmac_result[offset + 3] & 0xff);
int hotp = bin_code % 1000000;
return hotp;
}
}
}

问题在于调用:

byte[] hmac_result = hmacsha1.ComputeHash(counter);

没有返回预期的结果,因此返回的 OTP 将是错误的。阅读 RFC4226 附录 D ( https://www.rfc-editor.org/rfc/rfc4226#appendix-D ),有一些测试值可以使用,但结果与它们不匹配:

From the RFC 4226, Appendix D:
The following test data uses the ASCII string
"12345678901234567890" for the secret:

Secret = 0x3132333435363738393031323334353637383930

Table 1 details for each count, the intermediate HMAC value.

Count Hexadecimal HMAC-SHA-1(secret, count)
0 cc93cf18508d94934c64b65d8ba7667fb7cde4b0
1 75a48a19d4cbe100644e8ac1397eea747a2d33ab
2 0bacb7fa082fef30782211938bc1c5e70416ff44
3 66c28227d03a2d5529262ff016a1e6ef76557ece
4 a904c900a64b35909874b33e61c5938a8e15ed1c
<snip>

Table 2 details for each count the truncated values (both in
hexadecimal and decimal) and then the HOTP value.

Truncated
Count Hexadecimal Decimal HOTP
0 4c93cf18 1284755224 755224
1 41397eea 1094287082 287082
2 82fef30 137359152 359152
3 66ef7655 1726969429 969429
4 61c5938a 1640338314 338314
<snip>

由于我在上面的示例中使用“12345678901234567890”作为键并使用“1”作为计数器,因此我希望 ComputeHash() 的结果为:75a48a19d4cbe100644e8ac1397eea747a2d33abOTP 为:287082

但我得到了 OTP:906627

我真的看不出我在这里做错了什么,有没有人使用 HMACSHA1 类在 C# 中成功实现了基于计数器的 OTP?

最佳答案

您错误地使用了计数器。计数器不应是 ASCII 字符串,它应该是 big-endian 中的数字(长)值。

使用

var counter = new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 };

代替此测试,您的代码将返回正确的 OTP。

关于C# System.Security.Cryptography.HMACSHA1.ComputeHash() 不返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10449129/

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