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 つの値を XOR するだけですか? ウィキペディア リンクの Python 実装には、いくつかの奇妙な計算がありました。助けてください!

4

1 に答える 1

3

はい、「⊕」は「排他的または」の記号です。

  • 注意: 最終的なハッシュを計算したら、通常の文字列比較を使用してハッシュが正しいかどうかを確認しないでくださいこれにより、攻撃者が任意のメッセージに署名できるようになります

  • で乗算される0x5c * blocksizeため、おそらく探しているものではないことに注意してください。各位置に含まれる長さの配列を作成します。0x5cblocksizeblocksize0x5c

  • 文字ではなく、ゼロバイトでパディングする必要があることに注意してください"0"。だからkey = key .. "0"間違っています。である必要がありkey = key .. "\0"ますが、Lua で NUL バイトを作成します。

于 2013-01-06T00:26:58.753 に答える