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。

    帮助到您了吗?

    打赏作者(支付宝):

  • 相关阅读:
    3.0.35 platform 设备资源和数据
    老子《道德经》第六十三章
    linux spi 主机与外设分离思想
    3.0.35 platform 总线、设备与驱动
    Linux 内核SPI子系统架构
    C 显示一个字符的编码值
    JAVA高级特性--内部类
    Java面向对象----接口概念
    Java面向对象----抽象类
    Java面向对象----多态概念,对象上下转型
  • 原文地址:https://www.cnblogs.com/frankyou/p/5434213.html
Copyright © 2011-2022 走看看