/// <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(, ).ToArray();
var rightKey = lstMacKey.GetRange(, ).ToArray();
var lstPlaintext = new List<byte>(bankData);
while (lstPlaintext.Count % != )
lstPlaintext.Add();
long intMacData = ;
for (var i = ; i < lstPlaintext.Count / ; i++)
{
if (i == )
intMacData = BitConverter.ToInt64(lstPlaintext.GetRange(i * , ).ToArray(), );
else
intMacData = intMacData ^ BitConverter.ToInt64(lstPlaintext.GetRange(i * , ).ToArray(), );
intMacData = BitConverter.ToInt64(Encrypt(BitConverter.GetBytes(intMacData), GetKey(leftKey)), );
}
var bysRet = Decrypt(BitConverter.GetBytes(intMacData), GetKey(rightKey));
bysRet = Encrypt(bysRet, GetKey(leftKey));
return Encoding.ASCII.GetBytes(BytesToHex(bysRet).ToUpper().Substring(,));
}
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。
帮助到您了吗?
打赏作者(支付宝):