CMAC-AES хеширование с PHP
Наша платформа API использует хэши CMAC-AES в качестве подписи для запроса. У нас есть библиотеки для создания этого хэша в Java и.NET, но нам нужно найти решение и для PHP. Проблема в том, что я не могу найти ничего, что, кажется, надежно генерирует хеш, который соответствует CMAC, генерируемому на нашем сервере или через библиотеку Java/.NET.
Единственная библиотека, которую я нашел, - это CryptLib, альфа-библиотека.
https://github.com/ircmaxell/PHP-CryptLib
Но он не генерирует тот же самый хэш, и я недостаточно хорош для криптозащиты, чтобы понять, почему (он устанавливает размеры блоков до 16 для AES, когда то, что я нахожу в сети, говорит, что размер блока AES равен 128).
Есть ли другие пути, по которым я могу пойти?
1 ответ
Вышеуказанная библиотека PHP-CryptLib, в конце концов, будет работать нормально. Моя проблема была только моей собственной ошибкой, связанной с бинарными и шестнадцатеричными данными.
Использование тестовых данных, предоставленных библиотекой
require_once 'lib/CryptLib/bootstrap.php';
$hasher = new CryptLib\MAC\Implementation\CMAC;
$key = '2b7e151628aed2a6abf7158809cf4f3c'; // from test/Data/Vectors/cmac-aes ...
$msg = '6bc1bee22e409f96e93d7e117393172a'; // from test/Data/Vectors/cmac-aes ...
$cmac = $hasher->generate($msg,$key);
echo $cmac;
// $cmac should be 070a16b46b4d4144f79bdd9dd04a287c
// actually getting ¢ nd{þ¯\ ¥á¼ÙWß
За исключением того, что CMAC-хеш использует двоичные данные, а не символы ascii, поэтому нужно упаковать их с помощью pack():
$key = pack("H*", '2b7e151628aed2a6abf7158809cf4f3c');
$msg = pack("H*", '6bc1bee22e409f96e93d7e117393172a');
Мой конкретный случай из реальной жизни пытался хэшировать произвольную строку, такую как:
$msg = 'Client|Guid-023-23023-23|Guid-0230-2402-252|string|123456|2012-11-08T20:55:34Z';
И чтобы сделать это, мне нужна была такая функция:
function pack_str($str) {
$out_str = "";
$len = strlen($str);
for($i=0; $i<$len; $i++) {
$out_str .= pack("c", ord(substr($str, $i, 1)));
}
return $out_str;
}
Как только данные были упакованы с помощью этой функции и прошли через хэш, я получил ожидаемый CMAC-хеш.