使用PHP进行CMAC-AES散列
发布时间:2020-12-13 16:19:14 所属栏目:PHP教程 来源:网络整理
导读:我们的API平台使用CMAC-AES哈希作为请求的签名.我们有可用于在 Java和.NET中创建此哈希的库,但是也需要找到 PHP的解决方案.问题是我找不到任何似乎可靠地生成与我们的服务器上生成的CMAC或Java / .NET库相匹配的哈希的东西. 我找到的唯一一个库是CryptLib,一
我们的API平台使用CMAC-AES哈希作为请求的签名.我们有可用于在
Java和.NET中创建此哈希的库,但是也需要找到
PHP的解决方案.问题是我找不到任何似乎可靠地生成与我们的服务器上生成的CMAC或Java / .NET库相匹配的哈希的东西.
我找到的唯一一个库是CryptLib,一个alpha库. https://github.com/ircmaxell/PHP-CryptLib 但它并没有产生相同的哈希值,而且我对加密也不够好以理解为什么(它强制AES的块大小为16,当我在网上找到时说AES块大小为128). 我可以去其他任何途径吗? 解决方法
上面的PHP-CryptLib库最终会正常工作.我的问题只是我自己的错误与二进制数据和十六进制数据有关.
使用库提供的测试数据之一 require_once 'lib/CryptLib/bootstrap.php'; $hasher = new CryptLibMACImplementationCMAC; $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{tˉ ¥á?ù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哈希. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |