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。

 

幫助到您了嗎?

打賞作者(支付寶):


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM