私はPHPで一般的なHMAC関数を実装しようとしています。私はthe RFCとwikipedia 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人で独自のHMACを実装しようとしています – Sherif
ありがとう、とても役に立ちます。私は私自身の暗号を転がすはずがないことを知っている。私は学ぶことを試みている。また、phpは私が必要とするSHA3のHMACをサポートしていません。 –
PHPは['hash_algos()'](http://php.net/hash-algos)にあるものをサポートしています。これは、いくつかのアルゴリズムに依存するシステムであり、他はPHPによってネイティブにサポートされています。 sha384は通常そこにあるはずです。 – Sherif