MACTripleDES
C#クラスに相当する MAC TripleDES を取得しようとしています。
以下を試してみmcrypt()
ましたが、それは TripleDES でのエンコードにすぎません。メッセージを認証するために C# で生成されるものと同等の MACTripleDES 文字列を取得する必要があります。
PHP の関数も調べましたhash_hmac()
が、TripleDES で MAC を生成するオプションはありません。
MACTripleDES
C#クラスに相当する MAC TripleDES を取得しようとしています。
以下を試してみmcrypt()
ましたが、それは TripleDES でのエンコードにすぎません。メッセージを認証するために C# で生成されるものと同等の MACTripleDES 文字列を取得する必要があります。
PHP の関数も調べましたhash_hmac()
が、TripleDES で MAC を生成するオプションはありません。
Microsoft は、彼らのクラスが準拠している標準についてわざわざ言及しなかったので、確信が持てませんが、この NIST ドキュメントは、Microsoft クラスが計算しているものであり、DES の代わりにトリプル DES のみを使用していると思われます。
mcrypt のプリミティブを使用して独自のメソッドを作成する必要があると思います。
編集1:
報奨金に触発されて、PHP と C# で同等の結果を示すこれらの 2 つの例があります。
まず、C#:
using System;
using System.Text;
using System.Security.Cryptography;
namespace TDESMacExample
{
class MainClass
{
public static void Main (string[] args)
{
var keyString = "012345678901234567890123";
var keyBytes = Encoding.ASCII.GetBytes(keyString);
var mac = new MACTripleDES(keyBytes);
var data = "please authenticate me example number one oh one point seven niner";
Console.WriteLine(data.Length);
var macResult = mac.ComputeHash(Encoding.ASCII.GetBytes(data));
Console.WriteLine(BitConverter.ToString(macResult));
// B1-29-14-74-EA-E2-74-2D
}
}
}
次に、PHP:
<?php
$data = 'please authenticate me example number one oh one point seven niner';
$key = '012345678901234567890123'; // Key must be 24 bytes long
$iv = '\x00\x00\x00\x00\x00\x00\x00\x00'; // All zero IV is required
$cipher = mcrypt_cbc(MCRYPT_3DES, $key, $data, MCRYPT_ENCRYPT, $iv);
$mac_result = substr($cipher, -8); // Last 8 bytes of the cipher are the MAC
echo "mac result : " . bin2hex($mac_result);
echo "<br>";
?>
MAC は、単純に CBC 暗号化データの最後の 8 バイトです。キー、IV、およびパディング方法が一致する場合、それらのバイトだけを使用できるはずです。
MAC 定義の詳細については、FIPS-81 の付録 F、DES Modes of Operationを参照してください。