/// <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。
幫助到您了嗎?
打賞作者(支付寶):