zoukankan      html  css  js  c++  java
  • ANSI X9.19 MAC算法

    /// <summary>
    /// 获取MAC校验字节数据
    /// </summary>
    /// <param name="bankData">报文字节</param>
    /// <returns>MAC校验字节数据</returns>
    internal static byte[] GetMacData(byte[] bankData)
    {
        var lstMacKey = new List<byte>(_macKey);
        var leftKey = lstMacKey.GetRange(0, 8).ToArray();
        var rightKey = lstMacKey.GetRange(8, 8).ToArray();
        var lstPlaintext = new List<byte>(bankData);
        while (lstPlaintext.Count % 8 != 0)
            lstPlaintext.Add(0);
        long intMacData = 0;
        for (var i = 0; i < lstPlaintext.Count / 8; i++)
        {
            if (i == 0)
                intMacData = BitConverter.ToInt64(lstPlaintext.GetRange(i * 8, 8).ToArray(), 0);
            else
                intMacData = intMacData ^ BitConverter.ToInt64(lstPlaintext.GetRange(i * 8, 8).ToArray(), 0);
            intMacData = BitConverter.ToInt64(Encrypt(BitConverter.GetBytes(intMacData), GetKey(leftKey)), 0);
        }
        var bysRet = Decrypt(BitConverter.GetBytes(intMacData), GetKey(rightKey));
        bysRet = Encrypt(bysRet, GetKey(leftKey));
        return Encoding.ASCII.GetBytes(BytesToHex(bysRet).ToUpper().Substring(0,8));
    }

    ANSI X9.19 MAC算法

    (1)      ANSI X9.19MAC算法只使用双倍长密钥。

    (2)      MAC数据先按8字节分组,表示为D0~Dn,如果Dn不足8字节时,尾部以字节00补齐。

    (3)      用MAC密钥左半部加密D0,加密结果与D1异或作为下一次的输入。

    (4)      将上一步的加密结果与下一分组异或,然后用MAC密钥左半部加密。

    (5)      直至所有分组结束。

    (6)      用MAC密钥右半部解密(5)的结果。

    (7)      用MAC密钥左半部加密(6)的结果。

    (8)      取(7)的结果的左半部作为MAC。

    帮助到您了吗?

    打赏作者(支付宝):

  • 相关阅读:
    zoj 3279 线段树 OR 树状数组
    fzu 1962 树状数组 OR 线段树
    hdu 5057 块状链表
    hdu3487 Play with Chain
    bzoj 1588营业额统计(HNOI 2002)
    poj2823 Sliding Window
    poj2828 Buy Tickets
    poj2395 Out of Hay
    poj3667 Hotel
    poj1703 Lost Cows
  • 原文地址:https://www.cnblogs.com/frankyou/p/5434213.html
Copyright © 2011-2022 走看看