PHP中的MACTripleDES

6

我正在尝试获取一个C# MACTripleDES 类的MAC TripleDES等效项。

我尝试使用mcrypt(),但那只是使用TripleDES进行编码。我需要获得与在C#中生成的等效MACTripleDES字符串相同的字符串以验证消息。

我还查看了PHP的hash_hmac()函数,但它不提供使用TripleDES生成MAC的选项。

2个回答

8
我不确定微软的这个类符合哪个标准,因为他们没有说明,但我怀疑这个微软类计算的是NIST文档,只是使用三重DES代替了DES。
我猜你需要使用mcrypt中的基本操作自己编写方法。
编辑1:
受到悬赏的启发,我有两个例子展示了PHP和C#等效结果。
首先是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>";
    ?>

抱歉耽擱了 - 我成功完成了程式碼,且與你所做的相同。 - michaelmmr
亲爱的GregS,有没有C#代码示例可以展示如何解密这个加密字符串?谢谢。 - Michael Samteladze
1
@MichaelSamteladze:你不需要解密MAC,因为它并不是加密。它是一个带有密钥的哈希函数,被用作一种校验和。 - President James K. Polk
@GregS 感谢您的解释。 - Michael Samteladze

1
MAC是CBC加密数据的最后8个字节。如果密钥、IV和填充方法匹配,您应该能够直接使用这些字节。
有关MAC定义的更多详细信息,请参见FIPS-81,DES操作模式的附录F。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接