/**
* PBOC_3DES_MAC算法实现
*
* @param string $data 需要计算MAC的数据
* @param string $key 计算MAC所使用的密钥,密钥长度必须为16个字节
* @param string $iv 初始化向量,长度必须为8个字节
* @param int $padding 填充方式,0表示无填充,1表示使用0x00填充,2表示使用0x80填充
* @return string 计算得到的MAC值,长度为8个字节
*/
private function calculatePboc3desMAC($data, $key, $iv = "\x00\x00\x00\x00\x00\x00\x00\x00", $padding = 2)
{
// 根据填充方式进行数据填充
$paddingData = null;
switch ($padding) {
case 0: // 无填充
$paddingData = $data;
break;
case 1: // 使用0x00填充
$paddingData = $data . str_repeat("\x00", 8 - strlen($data) % 8);
break;
case 2: // 使用0x80填充
$paddingData = $data . "\x80" . str_repeat("\x00", 7 - strlen($data) % 8);
break;
default:
throw new \Exception("Invalid padding mode.");
}
$leftKey = substr($key, 0, 8);
$longKey = substr($key, 0, 16).$leftKey;
// 将密钥进行分组
$datas = str_split($paddingData, 8);
$last = array_pop($datas);
// 对前N-1组数据进行DES加密
$mac = $iv;
foreach ($datas as $i => $v) {
$mac = openssl_encrypt($mac ^ $v, "DES-CBC", $leftKey, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
}
//对最后一组数据进行3DES加密
$mac = openssl_encrypt($mac ^ $last, "DES-EDE-CBC", $longKey, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
// 返回计算得到的MAC值
return strtoupper(bin2hex($mac));
}
PBOC_3DES_MAC php 算法实现
最新推荐文章于 2024-04-30 11:41:10 发布