使用PHP进行CMAC-AES散列

时间:2012-11-08 23:42:52

标签: php encryption cryptography aes cmac

我们的API平台使用CMAC-AES哈希作为请求的签名。我们有可用于在Java和.NET中创建此哈希的库,但是也需要找到PHP的解决方案。问题是我找不到任何似乎可靠地生成与我们的服务器上生成的CMAC或Java / .NET库相匹配的哈希的东西。

我找到的唯一一个库是CryptLib,一个alpha库。

https://github.com/ircmaxell/PHP-CryptLib

但是它没有生成相同的哈希值,而且我对crypto的理解也不够好(因为我在网上找到的AES块大小为128时,它强制将块大小调整为16)。

我可以去其他任何途径吗?

1 个答案:

答案 0 :(得分:2)

上面的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 hasher使用二进制数据而不是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; 
} 

一旦数据被该函数打包并通过hasher运行,我就得到了我期待的CMAC哈希。