gpt4 book ai didi

Delphi HMAC-SHA1 意想不到的结果

转载 作者:行者123 更新时间:2023-12-02 02:50:54 27 4
gpt4 key购买 nike

我正在使用旧版本的 Delphi(Delphi 5)进行编写,原因我无法在该线程中解释。我正在尝试实现 HOTP,目前我的所有代码都缺少 HMACSHA1 部分,我不明白为什么。我按照 RFC 2202 实现了 HMACSHA,并将我的结果与许多其他 HMACSHA1 生成器进行了比较。所有这些都匹配。

然后,我开始为 HOTP 实现 RFC 4226,并惊讶地发现,与他们在 RFC ( https://www.ietf.org/rfc/rfc4226.txt ) 底部提供的示例数据相比,我的中间 HMACSHA1 结果是错误的。

这是来自 RFC 的测试向量

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

但是,使用我的 HMACSHA1 函数,如下所示:

function HMAC_SHA1(Text, Key: AnsiString): AnsiString;
var
ipad, opad, s: AnsiString;
n: Integer;
SHA1Context: TSHA1Ctx;
begin
if Length(Key) > 64 then
Key := SHA1(Key);
ipad := StringOfChar(#$36, 64);
opad := StringOfChar(#$5C, 64);
for n := 1 to Length(Key) do
begin
ipad[n] := AnsiChar(Byte(ipad[n]) xor Byte(Key[n]));
opad[n] := AnsiChar(Byte(opad[n]) xor Byte(Key[n]));
end;
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, ipad);
SHA1Update(SHA1Context, Text);
s := SHA1Final(SHA1Context);
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, opad);
SHA1Update(SHA1Context, s);
Result := SHA1Final(SHA1Context);
end;

我尝试:

HMAC_SHA1('12345678901234567890', '0');

我的答案是

948d4b44f3e0aac05904d6fd82ab7b8bbe761a4c

与下面链接的在线生成器相同

http://www.freeformatter.com/hmac-generator.html#ad-output

那么,我做错了什么?

最佳答案

至少有一个问题 - 您正在检查 > block 大小 (64) 的键,但您还必须检查短于 block 大小 (64) 的键,这些键需要在右侧用零填充。

上面的代码中有类似的内容...

//current check if > length
if Length(Key) > 64 then
Key := SHA1(Key);

//also check < length
if Length(Key) < 64 then
Key := Key + StringOfChar(#0, 64 - Length(Key));

注意 - 使用字节数组效果更好

关于Delphi HMAC-SHA1 意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22338236/

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