PBOC_3DES_MAC php 算法实现

/**
     * 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));
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值