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-хеш.

Другие вопросы по тегам