2

我需要用纯 Lua 编写一个 HMAC-MD5 算法。

从维基百科得到这个算法

function hmac (key, message)
    if (length(key) > blocksize) then
        key = hash(key) // keys longer than blocksize are shortened
    end if
    if (length(key) < blocksize) then
        key = key ∥ [0x00 * (blocksize - length(key))] // keys shorter than blocksize are zero-padded ('∥' is concatenation) 
    end if

    o_key_pad = [0x5c * blocksize] ⊕ key // Where blocksize is that of the underlying hash function
    i_key_pad = [0x36 * blocksize] ⊕ key // Where ⊕ is exclusive or (XOR)

    return hash(o_key_pad ∥ hash(i_key_pad ∥ message)) // Where '∥' is concatenation
end function

我有来自这里的 md5 代码。md5计算功能正常工作..

在lua中实现算法,到目前为止我有以下代码

local function hmac_md5(key,msg)
    local blocksize = 64

    if string.len(key) > blocksize then 
        key = calculateMD5(key)
    end 

    while string.len(key)<blocksize do 
        key = key .. "0"
    end 

    -- local o_key_pad = bit_xor((0x5c * blocksize),key) 
    -- local i_key_pad = bit_xor((0x36 * blocksize),key)

    return calculateMD5(o_key_pad..calculateMD5(i_key_pad..message))
end 

--calculateMD5 is the md5.Calc function in the Stackoverflow link specifed

我被困在计算 o_key_pad 和 i_key_pad 的部分。我只是对 2 个值进行异或吗?维基百科链接中的 python 实现有一些奇怪的计算。请帮忙!

4

1 回答 1

3

是的,“⊕”是“异或”的符号。

  • 记住:一旦你计算出最终的散列,不要使用普通的字符串比较来检查散列是否正确。这允许攻击者签署任意消息。

  • 请注意,这0x5c * blocksize可能不是您要寻找的,因为它0x5c乘以blocksize. 您想创建一个blocksize包含0x5c每个位置的长度数组。

  • 请注意,您必须用零字节填充,而不是字符"0"。所以key = key .. "0"是错误的。它应该是key = key .. "\0",或者你在 Lua 中创建 NUL 字节。

于 2013-01-06T00:26:58.753 回答