在PHP MACTripleDES(MACTripleDES in PHP)

2019-06-24 07:50发布

我试图让一个MAC TripleDes的相当于C#的MACTripleDES类。

我曾尝试以下mcrypt()但也只是在TripleDes的编码。 我需要得到同等MACTripleDES字符串是在C#中生成验证消息的人。

我也看了一下PHP的hash_hmac()函数,但它并没有给生成MAC与TripleDes的的选项

Answer 1:

我不知道,因为微软并没有刻意去说什么标准的类符合,但我怀疑这NIST文档是Microsoft类是什么计算,只有在PLACE 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>";
    ?>


Answer 2:

该MAC是简单地将最后8个字节的CBC加密数据。 如果密钥,IV和填充方法匹配,你应该能够只使用这些字节。

有关MAC定义的详细信息,请参见附录F FIPS-81,运行的DES模式 。



文章来源: MACTripleDES in PHP