2016-08-27 12 views
0

私はPHPで一般的なHMAC関数を実装しようとしています。私はthe RFCwikipedia pageに従っていますが、私はサンプル出力と一致するように私の機能を得ることはできません。私は間違って何をしていますか?PHPで私のHMACの実装に何が問題になっていますか?

function myHmac(string $data, string $key, callable $algoFn, int $algoBlockSizeInBytes): string 
    { 
    if (strlen($key) > $algoBlockSizeInBytes) 
    { 
     $key = $algoFn($key); // keys longer than blocksize are shortened 
    } 

    if (strlen($key) < $algoBlockSizeInBytes) 
    { 
     $key = $key . str_repeat(0x00, $algoBlockSizeInBytes - strlen($key)); // keys shorter than blocksize are zero-padded 
    } 

    $outerKeyPad = str_repeat(0x5c, $algoBlockSizeInBytes)^$key; 
    $innerKeyPad = str_repeat(0x36, $algoBlockSizeInBytes)^$key; 

    return bin2hex($algoFn($outerKeyPad . $algoFn($innerKeyPad . $data))); 
    } 

$md5Fn = function ($str) { return md5($str, true); }; 

echo 'my output: ' . myHmac("", "", $md5Fn, 64) . "\n"; 
echo 'correct output: ' . hash_hmac('md5', "", "") . "\n"; 
+1

1人で独自のHMACを実装しようとしています – Sherif

+0

ありがとう、とても役に立ちます。私は私自身の暗号を転がすはずがないことを知っている。私は学ぶことを試みている。また、phpは私が必要とするSHA3のHMACをサポートしていません。 –

+0

PHPは['hash_algos()'](http://php.net/hash-algos)にあるものをサポートしています。これは、いくつかのアルゴリズムに依存するシステムであり、他はPHPによってネイティブにサポートされています。 sha384は通常そこにあるはずです。 – Sherif

答えて

3

あなたは繰り返される文字列の代わりに整数でstring_repeat()を呼び出します。したがって、整数から文字列への変換が適用されます。これは現在、0x36 - >'54' - >'54545454...5454''54'を64回繰り返したように)などのようになります。実際のバイトを取得するにはchr(0x36)を使用してください。

+0

うん、それだった。ありがとう。 –

関連する問題