php - 使用 PHP 进行 CMAC-AES 散列

标签 php encryption cryptography aes cmac

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

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

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

但它没有生成相同的哈希值,而且我对加密技术的了解还不够好,无法理解原因(它强制 AES 的 block 大小为 16,而我在网上发现的 AES block 大小为 128)。

我还有其他途径吗?

最佳答案

上面的 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 哈希。

关于php - 使用 PHP 进行 CMAC-AES 散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299876/

相关文章:

php - AES中输入与密文长度的关系

java - 使用 Java 从图像中提取隐藏文件

PHP MySQL 如果关系表中的键不存在则插入

java - 创建和维护多个密码

java - 密码加密

c# - .NET 加密字节数组

java - 如何将 Bouncy CaSTLe SCrypt 字节数组转换为字符串格式或 HexString 格式?

php - htaccess 使用 cname、vhosts 和 htaccess 将所有子域 + www 重定向到域

php - 如何在 PHP 中的关联数组中的特定关联键之后添加新的 [key] => [value] 对?

php - Laravel Request::is() - 有更好的方法吗?