当前位置:Gxlcms > PHP教程 > 有没有谁搞过银联POS终端mac算法[php版本]?

有没有谁搞过银联POS终端mac算法[php版本]?

时间:2021-07-01 10:21:17 帮助过:41人阅读

安全机制

对报文进行MAC,以实现防篡改

发起方先对标签数据进行Base64编码,根据编码后的数据,然后进行循环异或(将数据分成若干个8个字节的数据段,最后不足8位后加0x00补齐8位)。得到标签数据。然后将新的报文发送给对方。

为原始报文的Base64编码结果

xml

    
ccb_pos pos_service
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48ZGF0YT48cHJvZHVjdD4wMzI2PC9wcm9kdWN0PjxwcmVtaXVtPjExMDAuMDwvcHJlbWl1bT48ZHJpdmVycz48ZHJpdmVyPkphbWVzPC9kcml2ZXI+PGRyaXZlcj5UZWRkeTwvZHJpdmVyPjwvZHJpdmVycz48L2RhdGE+ 8U42KXyd76FSCmRT //char 16

处理方式

接收方在接收到报文后,将标签数据分成若干个8个字节的数据段,最后不足8位后加0x00补齐8位,循环异或一次。然后和标签数据进行比对。如果比对一致表示通过验证,最后将标签数据按照Base64解码,得到交易明文数据。

参考文档

http://blog.163.com/gene_lu/blog/static/6402542120133151112717/

网上找了一段PHP代码

这代码有问题,大概方式。

php

'; var_dump(base64_decode($str)); echo '


'; var_dump(mac_($str)); echo '


'; //说明:MAC算法,将字符串$data分为八字节为单位的数据块,标号为D1,D2,D3..,如果最后的数据块不足 //8字节,则在后面加上\x00直到长度达到8字节为止,最后按照下面流程产生MAC, //8字节的初始值:\x00\x00\x00\x00\x00\x00\x00\x00 //流程:初始值 异或 D1 —>异或的结果进行des 异或 D2 —>异或的结果进行des 异或 D2 —>异或的结果进行des function mac_($data) { //设初始值 $init="\x00\x00\x00\x00\x00\x00\x00\x00"; //对$data进行8字节分割,获得数组 $tmp_data=strtoarray($data,8); $tmp_init=$init; foreach($tmp_data as $value) { //进行异或运算 $tmp_init=myEncrypt($tmp_init,$value); var_dump($tmp_init); //进行加密 //$tmp_init=MCRYPT_str($tmp_init); } var_dump($tmp_init); return bin2hex($tmp_init); } //函数名:strtoarray //说明:将字符串按8字节切割,最后不足8字节的用\x00填补 function strtoarray($str,$limit) { $len=strlen($str); $tmp_arr=array(); $count=floor($len/$limit); $left_num=$len-$count*$limit; for($i=0;$i<$left_num;$i++) { $str.="\x00"; } for($i=0;$i<$count;$i++) { $tmp_arr[]=substr($str,0,$limit); if(strlen($str)>$limit+1) { $str=substr($str,$limit,strlen($str)); } } return $tmp_arr; } //函数名:myEncrypt //说明:异或运算函数 function myEncrypt($string, $key) { for($i=0;$i

不知道哪位研究过没有,怎么做的,没有头绪。

回复内容:

安全机制

对报文进行MAC,以实现防篡改

发起方先对标签数据进行Base64编码,根据编码后的数据,然后进行循环异或(将数据分成若干个8个字节的数据段,最后不足8位后加0x00补齐8位)。得到标签数据。然后将新的报文发送给对方。

为原始报文的Base64编码结果

xml

    
ccb_pos pos_service
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48ZGF0YT48cHJvZHVjdD4wMzI2PC9wcm9kdWN0PjxwcmVtaXVtPjExMDAuMDwvcHJlbWl1bT48ZHJpdmVycz48ZHJpdmVyPkphbWVzPC9kcml2ZXI+PGRyaXZlcj5UZWRkeTwvZHJpdmVyPjwvZHJpdmVycz48L2RhdGE+ 8U42KXyd76FSCmRT //char 16

处理方式

接收方在接收到报文后,将标签数据分成若干个8个字节的数据段,最后不足8位后加0x00补齐8位,循环异或一次。然后和标签数据进行比对。如果比对一致表示通过验证,最后将标签数据按照Base64解码,得到交易明文数据。

参考文档

http://blog.163.com/gene_lu/blog/static/6402542120133151112717/

网上找了一段PHP代码

这代码有问题,大概方式。

php

'; var_dump(base64_decode($str)); echo '


'; var_dump(mac_($str)); echo '


'; //说明:MAC算法,将字符串$data分为八字节为单位的数据块,标号为D1,D2,D3..,如果最后的数据块不足 //8字节,则在后面加上\x00直到长度达到8字节为止,最后按照下面流程产生MAC, //8字节的初始值:\x00\x00\x00\x00\x00\x00\x00\x00 //流程:初始值 异或 D1 —>异或的结果进行des 异或 D2 —>异或的结果进行des 异或 D2 —>异或的结果进行des function mac_($data) { //设初始值 $init="\x00\x00\x00\x00\x00\x00\x00\x00"; //对$data进行8字节分割,获得数组 $tmp_data=strtoarray($data,8); $tmp_init=$init; foreach($tmp_data as $value) { //进行异或运算 $tmp_init=myEncrypt($tmp_init,$value); var_dump($tmp_init); //进行加密 //$tmp_init=MCRYPT_str($tmp_init); } var_dump($tmp_init); return bin2hex($tmp_init); } //函数名:strtoarray //说明:将字符串按8字节切割,最后不足8字节的用\x00填补 function strtoarray($str,$limit) { $len=strlen($str); $tmp_arr=array(); $count=floor($len/$limit); $left_num=$len-$count*$limit; for($i=0;$i<$left_num;$i++) { $str.="\x00"; } for($i=0;$i<$count;$i++) { $tmp_arr[]=substr($str,0,$limit); if(strlen($str)>$limit+1) { $str=substr($str,$limit,strlen($str)); } } return $tmp_arr; } //函数名:myEncrypt //说明:异或运算函数 function myEncrypt($string, $key) { for($i=0;$i

不知道哪位研究过没有,怎么做的,没有头绪。

全是二进制的, php 弄, 太费劲了吧. 为何不用 java 来搞

人气教程排行