/// <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。

帮助到您了吗?

打赏作者(支付宝):

ANSI X9.19 MAC算法的更多相关文章

  1. ANSI-X99MAC算法和PBOC的3DES MAC算法

    仅仅要有标准的DES加密和解密算法.类似ANSI-X99MAC算法和PBOC3DES算法就非常好实现.他们都是用DES算法再经过一层算法实现的.实现原理看图就能看明确.3DES算法实现就更简单了.就是 ...

  2. DES算法和MAC算法总结

    需要用到的工具类,代码如下: import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java. ...

  3. ANSI X9.8标准 PIN xor PAN获取PIN BlOCK

    ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 之前看到几篇介绍,把ANSI说成16个字节,真心扯淡,各种误人子弟,真正的ANSI算法其实是8个字节,具体格式如下: (1) AN ...

  4. Java实现3DES加密--及ANSI X9.8 Format标准 PIN PAN获取PIN BlOCK

    1, 采用银联ANSI X9.8标准 PIN xor PAN获取PIN BlOCK 2, 采用3Des进行加密 参考: des和3Des加密算法实现 要点:因为3DES是对称加密算法,key是24位, ...

  5. 消息摘要算法-MAC算法系列

    一.简述 mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMA ...

  6. MAC算法

    MAC算法 (Message Authentication Codes) 带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制.此时Hash值称作MAC. 原理:在md与sha系 ...

  7. Crossover 19(Mac运行Windows应用程序)

    怎样才能在Mac上运行Windows应用程序?相信这是很多朋友都在问的问题,今天macdown(mac软件平台)小编为大家带来Crossover 19 Mac版下载,Crossover 19 mac版 ...

  8. 数据结构和算法(Golang实现)(19)排序算法-冒泡排序

    冒泡排序 冒泡排序是大多数人学的第一种排序算法,在面试中,也是问的最多的一种,有时候还要求手写排序代码,因为比较简单. 冒泡排序属于交换类的排序算法. 一.算法介绍 现在有一堆乱序的数,比如:5 9 ...

  9. OpenCV学习(19) 细化算法(7)

    最后再来看一种通过形态学腐蚀和开操作得到骨架的方法.http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/ 代码非常简单: v ...

随机推荐

  1. 构建基于WinRT的WP8.1 App 02:数据绑定新特性

    基于WinRT的Windows Phone 8.1以及Windows 8.1中Xaml数据绑定增加了一些新特性. FallBackValue属性:FallBackValue在绑定的值属性值不存在时,可 ...

  2. 初探设计:Java接口和抽象类何时用?怎么用?

    今天犯了个错: “接口变动,伤筋动骨,除非你确定只有你一个人在用”.哪怕只是throw了一个新的Exception.哈哈,这是我犯的错误. 一.接口和抽象类 类,即一个对象. 先抽象类,就是抽象出类的 ...

  3. python load mat 并按变量名赋值

    import numpy as np import scipy.io as io creat = locals() tmp = io.loadmat("all.mat") for ...

  4. NSURLSession与AFNetworking3.0

    下面是用GET方式请求一个页面数据的示例: AFNetworking 2.x NSString *siteUrl = @"http://webinar.ofweek.com/readDemo ...

  5. 设计模式——"simple Factory"

    顾名思义,工厂模式就是类似于生活中的工厂,可以生产我们想要的东西,回到代码,假如我们需要一个实例,直接从工厂中拿即可. eg:假如我们定义一个“球”类的接口 public interface Ball ...

  6. php网页切图/js切图

    PhantomJS抓取网站页面信息以及网站截图 http://phantomjs.org/download.html PHP imagegrabscreen和imagegrabwindow(截取网站缩 ...

  7. npm命令总结

    统一切换到项目目录 安装redux :npm install -save redux 安装react-redux : npm install -save react-redux

  8. 【Java】深入理解ThreadLocal

    一.前言 要理解ThreadLocal,首先必须理解线程安全.线程可以看做是一个具有一定独立功能的处理过程,它是比进程更细度的单位.当程序以单线程运行的时候,我们不需要考虑线程安全.然而当一个进程中包 ...

  9. java攻城狮之路(Android篇)--MP3 MP4、拍照、国际化、样式主题、图片移动和缩放

    一.MP3播放器 查看Android API文档可以看到MediaPlayer状态转换图: 练习: package com.shellway.mp3player; import java.io.Fil ...

  10. C# 事件和委托

    相信大家在面试的时候会经常问到事件和委托的区别,为什么.net中需要事件和委托这样类似的问题吧,对于一些初学者来说可平时用的过程中也不知道为什么, 只知道这样用,而对于其中的实现机制不是很清楚, 所以 ...