8583报文MAC算法以及MAC串的数据格式有关问题

8583报文MAC算法以及MAC串的数据格式问题
本来发在问答板块来着,无奈无人解答,只好转回JAVA区求解了:8583报文MAC算法以及MAC串的数据格式有关问题
最近在做8583的接口联调,目前手头只有一份文档描述,小弟也是头一次接触8583,目前卡在MAC校验这一关了,无论怎么算MAC,发过去返回的都是A0,MAC校验错,
原8583文档关于MAC算法描述如下:

将欲发送给POS中心的消息中,从消息类型(MTI)到63域之间的部分构成MAC ELEMEMENT BLOCK (MAB)

问题就是,这个发送给POS中心的消息格式到底要什么样的?

比如原数据:
loginData.put("2", "4367450070849241");// 主帐号 最大19字节BCD
        loginData.put("3", "000000");// 处理码  定长6字节
        loginData.put("4", "000000000001");// 交易金额 定长12字节
        loginData.put("11", "123456");// 流水号 定长6字节
        //loginData.put("14", "0218");// 有效期 定长4字节 
        loginData.put("22", "012");//输入方式码 后一个0为左靠右补0 定长3字节
        loginData.put("25", "00");//服务点条件码 消费固定00
        loginData.put("41", "00015719");//终端号
        loginData.put("42", "105110070110485");// 商户号
        loginData.put("49", "156");//货币代码 000000080030
        loginData.put("60", "22000008"); //2200009100050

以上是原数据。
拼装成字符串后:
4367450070849241000000000000000001123456012000001571910511007011048515622000008
按照文档要求,对一些数据进行左补空格 或者右补‘0’或者转化为16进制位后:
4360075312486901000000000000000001123456012[0]000001531110500327001051131353622000005003[0
其中[]括号内的0是按照文档要求对原数据进行长度补充的.
再给各个数字域添加长度后:
[16]436007531248690100000000000000000112345601200000015311105003270010511313536 [0011]220000050030

Mac算法为ECB的,以上这几种数据 到底应该选哪种转为bytes去做MAC运算呢?

------解决方案--------------------
java基本在做应用层的事。。。你这个在拼数据报文呢,去嵌入式问问吧 或者通信协议
------解决方案--------------------
不知道你在说什么。。
你那个补0以及添加长度是什么标准上规定的还是什么?
还有你有没有MAC校验相关代码?
------解决方案--------------------
8583貌似是POS机上的通信协议吧。

第一,整个要组装的是二进制的报文,楼主的那个是字符串,根本不是二进制的信息。

第二, Java程序一般偏向于应用层的功能,底层数据的处理,用C语言比较有优势,如果非要用Java,那写起程序来比较麻烦。

第三, 这个问题发在Java版里,能解答的人比较少。发到C语言,或者串口通信之类的版中,可能效果好些。

最后,谈谈我的想法:
首先,通信一些一般报文中,都具备包头、包体、包尾三个部分。
其次,包头一般都是定长的,包体变长,包尾是校验信息。
第三,楼主给出的数据,没有包头和包尾,并且,包体也应该写成十六进制形式,看起来相对专业一点,
弄个字符串出来,感觉像是外行人。
最后,发现楼主对8583协议的理解和实现上,存在很大差距。不妨再仔细研究一下协议和协议的实现部分。
磨刀不误砍柴工。
------解决方案--------------------
引用:
问题就是,这个发送给POS中心的消息格式到底要什么样的?

这个消息格式,楼主只要有耐心的研读一下《中国银联POS终端规范》就能在里面找到了。
POS终端交换信息的数据中,分为三个部分: TPDU、报文头、应用数据。
其中,应用数据就是IOS8583格式的数据。
IOS8583格式的数据中,也可以分成三个部分:消息类型、位元表、域数据区。
消息类型是4个字节长度的数据,位元表是8字节(共64位)或者16字节(128位)的数据,域数据区是变长的。

MAC的MAB我个人理解就是8583报文中除了最后你要算的校验域数据以外的所有数据序列(64位位元表是这样,128位位元表相对复杂一点)。
------解决方案--------------------
引用:
拼装成字符串后:
4367450070849241000000000000000001123456012000001571910511007011048515622000008
按照文档要求,对一些数据进行左补空格 或者右补‘0’或者转化为16进制位后:
4360075312486901000000000000000001123456012[0]000001531110500327001051131353622000005003[0
其中[]括号内的0是按照文档要求对原数据进行长度补充的.
再给各个数字域添加长度后:
[16]436007531248690100000000000000000112345601200000015311105003270010511313536 [0011]220000050030

Mac算法为ECB的,以上这几种数据 到底应该选哪种转为bytes去做MAC运算呢?

最后一种是最接近要求的数据了。
但是,根据我的上述回复,楼主的数据中,还缺少消息类型和位元表的数据。
至于域数据区是否缺少数据,我没仔细看。
------解决方案--------------------
算法?看起来很高端的样子 嘿嘿
------解决方案--------------------
楼主说的这个我不太明白是什么意思~我跟你说一下我当初做的8583报文mac检验:双方约定哪些重要字段参与mac检验(这个基本上是固定的~接口中只要有定义这些字段都要参与检验);约定mac算法(你用的应该是由对方提供的算法)……然后发报文前你这边就要通过上述两个约定计算出mac域(接口中应该有告诉你哪个bit位是用来传mac的),然后你把Mac值和你上面的报文拼起来发送给对方,对方再根据约定从你的报文中取出关键字段通过约定算法计算出mac值,然后把这个值和你通过报文上送给他的Mac值比较看是否一致!明白了吗?用手机打好费劲╰_╯
------解决方案--------------------
这东西 我是搞过的。。。。。。。不过现在不搞了。
------解决方案--------------------
感谢楼主8583报文MAC算法以及MAC串的数据格式有关问题
------解决方案--------------------
MAC  算法固定, 主要是要从那个字段开始到哪个字段结束 每家发卡机构不一样
------解决方案--------------------
好高端啊!8583报文MAC算法以及MAC串的数据格式有关问题
------解决方案--------------------
首先你要了解8583包报文每个域的格式,比如BCD、ANSI、bit,组成MAB串是不可显字符串,16进制
确定DES算法,单DES还是3DES
1、8个字节为一组,不足8个字节后补0x00
2、采用MAC KEY进行ECB运算(应该是MAB8个字节异或,最后异或结果为8个字节,再用MAC KEY 进行DES加密)
3、加密后的结果为8个字节串,不可显字符,打包进8583包64域上送即可。
------解决方案--------------------
引用:
首先你要了解8583包报文每个域的格式,比如BCD、ANSI、bit,组成MAB串是不可显字符串,16进制
确定DES算法,单DES还是3DES
1、8个字节为一组,不足8个字节后补0x00
2、采用MAC KEY进行ECB运算(应该是MAB8个字节异或,最后异或结果为8个字节,再用MAC KEY 进行DES加密)
3、加密后的结果为8个字节串,不可显字符,打包进8583包64域上送即可。


以你的字据字串,以十六进制展开显示为:
43674500708492410000000000000000011234560218001200303030313537313931303531313030373031313034383501563232303030303038