MACTripleDES in PHP
本文关键字:PHP in MACTripleDES | 更新日期: 2023-09-27 18:33:41
我正在尝试获得相当于C#MACTripleDES
类的MAC TripleDES。
我尝试过遵循mcrypt()
,但这只是在 TripleDES 中编码。我需要获取一个等效的 MACTripleDES 字符串,就像在 C# 中生成的字符串一样,以对消息进行身份验证。
我还查看了PHP的hash_hmac()
函数,但它没有提供使用TripleDES生成MAC的选项
我不确定,因为Microsoft懒得说他们的类符合什么标准,但我怀疑这个NIST文档是Microsoft类正在计算的,只使用三重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>";
?>
MAC 只是 CBC 加密数据的最后八个字节。如果键、IV 和填充方法匹配,您应该能够只使用这些字节。
有关 MAC 定义的更多详细信息,请参阅 FIPS-81 的附录 F,DES 操作模式。