4

リクエストの署名としてCMAC-AESハッシュを使用するAPIプラットフォーム。Javaと.NETでこのハッシュを作成するために利用できるライブラリがありますが、PHPのソリューションも見つける必要があります。問題は、サーバー上またはJava/.NETライブラリを介して生成されているCMACと一致するハッシュを確実に生成しているように見えるものが見つからないことです。

私が見つけた唯一のライブラリは、アルファライブラリであるCryptLibです。

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

しかし、それは同じハッシュを生成しておらず、その理由を理解するのに十分な暗号がありません(オンラインで見つけたAESのブロックサイズが128である場合、AESのブロックサイズを16に強制します)。

私が降りることができる他の道はありますか?

4

1 に答える 1

2

上記の PHP-CryptLib ライブラリは、最終的には問題なく動作します。私の問題は、バイナリと16進データに関連する私自身の間違いでした。

ライブラリ one が提供するテスト データを使用する

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 char ではなくバイナリ データを使用するため、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 ハッシュが得られました。

于 2012-11-09T19:34:24.390 に答える