POS DES MAC 算法

DES和MAC加解密算法,已经在多个产品中得到了实际应用,不需任何修改就可使用

本文根据《中国银联直联POS终端规范》的阐述,用C语言编程实现,该算法在实际的商业POS终端中使用。POS终端采用ECB的加密方式,简述如下:
a) 将欲发送给POS中心的消息中,从消息类型(MTI)到63域之间的部分构成MAC 
ELEMEMENT BLOCK (MAB)。
b) 对MAB,按每8个字节做异或(不管信息中的字符格式),如果最后不满8个字节,则添加“0X00”。
示例 :
MAB = M1 M2 M3 M4
其中: 
M1 = MS11 MS12 MS13 MS14 MS15 MS16 MS17 MS18
M2 = MS21 MS22 MS23 MS24 MS25 MS26 MS27 MS28
M3 = MS31 MS32 MS33 MS34 MS35 MS36 MS37 MS38
M4 = MS41 MS42 MS43 MS44 MS45 MS46 MS47 MS48

按如下规则进行异或运算:
MS11 MS12 MS13 MS14 MS15 MS16 MS17 MS18
XOR) MS21 MS22 MS23 MS24 MS25 MS26 MS27 MS28
---------------------------------------------------
TEMP BLOCK1 = TM11 TM12 TM13 TM14 TM15 TM16 TM17 TM18

然后,进行下一步的运算:
TM11 TM12 TM13 TM14 TM15 TM16 TM17 TM18
XOR) MS31 MS32 MS33 MS34 MS35 MS36 MS37 MS38
---------------------------------------------------
TEMP BLOCK2 = TM21 TM22 TM23 TM24 TM25 TM26 TM27 TM28

再进行下一步的运算:
TM21 TM22 TM23 TM24 TM25 TM26 TM27 TM28
XOR) MS41 MS42 MS43 MS44 MS45 MS46 MS47 MS48
---------------------------------------------------
RESULT BLOCK = TM31 TM32 TM33 TM34 TM35 TM36 TM37 TM38

c) 将异或运算后的最后8个字节(RESULT BLOCK)转换成16 个HEXDECIMAL:
RESULT BLOCK = TM31 TM32 TM33 TM34 TM35 TM36 TM37 TM38
= TM311 TM312 TM321 TM322 TM331 TM332 TM341 TM342 ||
TM351 TM352 TM361 TM362 TM371 TM372 TM381 TM382

d) 取前8 个字节用MAK加密:
ENC BLOCK1 = eMAK(TM311 TM312 TM321 TM322 TM331 TM332 TM341 TM342)
= EN11 EN12 EN13 EN14 EN15 EN16 EN17 EN18

e) 将加密后的结果与后8 个字节异或:
EN11 EN12 EN13 EN14 EN15 EN16 EN17 EN18
XOR) TM351 TM352 TM361 TM362 TM371 TM372 TM381 TM382
------------------------------------------------------------
TEMP BLOCK= TE11 TE12 TE13 TE14 TE15 TE16 TE17 TE18

f) 用异或的结果TEMP BLOCK 再进行一次单倍长密钥算法运算。
ENC BLOCK2 = eMAK(TE11 TE12 TE13 TE14 TE15 TE16 TE17 TE18)
= EN21 EN22 EN23 EN24 EN25 EN26 EN27 EN28

g) 将运算后的结果(ENC BLOCK2)转换成16 个HEXDECIMAL:
ENC BLOCK2 = EN21 EN22 EN23 EN24 EN25 EN26 EN27 EN28
= EM211 EM212 EM221 EM222 EM231 EM232 EM241 EM242 ||
EM251 EM252 EM261 EM262 EM271 EM272 EM281 EM282
示例 :
ENC RESULT= %H84, %H56, %HB1, %HCD, %H5A, %H3F, %H84, %H84
转换成16 个HEXDECIMAL:
“8456B1CD5A3F8484”
h) 取前8个字节作为MAC值。
取”8456B1CD”为MAC值。

Java代码  

  1. 数据报文:  
  2. 0x 1234567890ABCDEFABCDEF1234567890   //$body  
  3. MAK:2222222222222222  
  4. Mac计算:  
  5. M1 = 0x 1234567890ABCDEF   
  6. M2 = 0x ABCDEF1234567890  
  7. M1 Xor M2 结果: 0x B9F9B96AA4FDB57F  
  8. 扩展成16字节数据:0x 42394639423936414134464442353746  
  9. MAK加密前半部分数据结果:0x 9FDE90A34CF73B2E  
  10. 加密结果与后半部分数据异或,结果:0x DEEAD6E70EC20C68  
  11. MAK加密异或结果:0x E267B6E21913D339  
  12. 扩展成16字节数据:0x45323637423645323139313344333339  
  13. Mac:E267B6E2  

php mac

Java代码  

  1. public function splitData($hexMacDataSource, $num=16)  
  2. {  
  3.     $len = 0;  
  4.   
  5.     $modValue = strlen($hexMacDataSource) % $num;  
  6.     if($modValue != 0)  
  7.     {  
  8.         $hexSrcDataLen = strlen($hexMacDataSource);  
  9.         $totalLen = $hexSrcDataLen + ($num - $modValue);  
  10.         $hexMacDataSource = str_pad($hexMacDataSource, $totalLen, "0");//16进制右补0  
  11.     }  
  12.   
  13.     $len = strlen($hexMacDataSource) / $num;  
  14.     $ds = array();  
  15.   
  16.     for ($i = 0; $i < $len; $i++)  
  17.     {  
  18.         if (strlen($hexMacDataSource) >= $num)  
  19.         {  
  20.             $ds[] = substr($hexMacDataSource,0, $num);  
  21.             $hexMacDataSource = substr($hexMacDataSource,$num);  
  22.         } else  
  23.         {  
  24.             throw new Exception("填充的数据非法!",6008);  
  25.         }  
  26.     }  
  27.     return $ds;  
  28. }  
  29.   
  30. public function hexXor($hexStr1 , $hexStr2)  
  31. {  
  32.     return str_pad(strtoupper(gmp_strval(gmp_xor(gmp_init($hexStr1, 16),gmp_init($hexStr2, 16)), 16)),16,'0',STR_PAD_LEFT);  
  33. }  
  34.   
  35. public function getBodyMac($body)  
  36. {  
  37.     //拆分MAC数据源,每组16位hex(8 byte())  
  38.     $ds = $this->splitData($body);  
  39.     $des = "";  
  40.     for ($i = 0; $i < count($ds); $i++)  
  41.     {  
  42.         if ($i == 0)  
  43.         {  
  44.             $des = $ds[$i];//$ds[$i] 是16进制数  
  45.         } else  
  46.         {  
  47.             $des = $this->hexXor($des, $ds[$i]);  
  48.         }  
  49.     }  
  50.     #异或结果扩展成 16字节 的 hex  
  51.     $hexStr16 = $this->encodeHex($des);  
  52.     #加密前8字节数据  
  53.     $left8  = substr($hexStr16,0,16);  
  54.     $right8 = substr($hexStr16,16,16);  
  55.     $tmpXor = $this->hexXor($this->encryptByDes($left8,$this->macKey), $right8);  
  56.     $bodyMac =  substr($this->encryptByDes($tmpXor,$this->macKey),0,8);  
  57.   
  58.     return $bodyMac;  
  59. }  
  60.   
  61. public function encodeHex($str)  
  62. {  
  63.     return strtoupper(bin2hex($str));  
  64. }  

#开始4个字节报文长度
$requestBodyLength = intval(trim(substr($request, 0, 4)));
$body = substr($request, 4, $requestBodyLength);
#报文体
$requestBody = substr($body, 0, $requestBodyLength - 8);
#最后8个字节为mac
$requestMac = substr($body, -8);

时间: 2024-10-03 22:58:29

POS DES MAC 算法的相关文章

农行 算法-农行POS接口Mac算法问题

问题描述 农行POS接口Mac算法问题 在农行POS接口挂接时,使用x9.9算法对整包进行mac计算,前置一直返回mac校验错,但对前置返回的数据使用同样的算法和密钥进行mac计算,得到的结果与返回数据中的值一致.有偿咨询.qq418955729 解决方案 应该资源提供开发包的

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

问题描述 8583报文MAC算法以及MAC串的数据格式问题 最近在做8583的接口联调,目前手头只有一份文档描述,小弟也是头一次接触8583,目前卡在MAC校验这一关了,无论怎么算MAC,发过去返回的都是A0,MAC校验错, 原8583文档关于MAC算法描述如下: 将欲发送给POS中心的消息中,从消息类型(MTI)到63域之间的部分构成MAC ELEMEMENT BLOCK (MAB) 问题就是,这个发送给POS中心的消息格式到底要什么样的? 比如原数据: loginData.put("2&qu

用perl来实现三重des的算法,不要伪代码

问题描述 用perl来实现三重des的算法,不要伪代码 三重des的伪代码理解,但是在用perl实现的时候,出现差错,希望有程序 解决方案 ****楼上正解******** 解决方案二: http://blog.csdn.net/gary162/article/details/50629749 解决方案三: 没实现过,只能推荐了:http://blog.sina.com.cn/s/blog_475cb6780100rft7.html

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

一.简述   mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMAC算法.关于hmac算法的详情可以参看RFC 2104(http://www.ietf.org/rfc/rfc2104.txt),这里包含了HmacMD5算法的C语言实现.   这里需要说明的是经过mac算法得到的摘要值也可以使用十六进制编码表示,其摘要值得长度与实现算法的摘要值长度相同.例如

c-请问,银联标准的MAC算法所加密的数据是十六进制类型的还是字符串类型的?

问题描述 请问,银联标准的MAC算法所加密的数据是十六进制类型的还是字符串类型的? 就是直接用解析好的数据串直接进行mac计算, 还是要把解析到的字符串先转成16进制再进行mac计算? 解决方案 看上去是字符串ascii 解决方案二: 一般都不会直接用字符串,对于设备数据协议等, 一般都是BYTE数组类型格式,所以你应该用16进制方式获取.

3des mac-JAVA --- 3DES CBC 模式 MAC 算法

问题描述 JAVA --- 3DES CBC 模式 MAC 算法 原文: 0x81,0x05,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x11, 0x5a,0x5a,0x5a,0x5a,0x5a,0x5a mac : 0xba,0x34,0x87,0xba,0x66,0x3a,0x15,0x8e 将原文经过3DES mac之后变成 (0xba,0x34,0x87,0xba,0x66,0x3a,0x15,0x8e) 哪位高手知道啊,求解???

银联8583报文中,mac算法的细节问题

问题描述 银联8583报文中,mac算法的细节问题 小弟我初次接触8583,虽然知道mac ecb的流程,但是在写代码的细节问题上恳请大神指点: 一开始说把MAB按每8个字节截位,依次把截好的代码段1与代码段2异或,生成异或结果1,再用异或结果1与代码段3异或...如此往复进行: 那首先作为参数的MAB数据是要十六进制的还是十进制的?如果是十六进制的那我函数里是不是应该按每16个字节截位? 还有这个循环异或的方法求大神指点一下,或者给代码看一下,谢谢! 解决方案 http://bbs.csdn.

DES算法解析

DES算法  美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告. 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES,Data Encryption Standard). 一.DES算法  美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密

加密算法之DES算法

一.DES算法美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告.加密算法要达到的目的(通常称为DES 密码算法要求)主要为以下四点: ☆提供高质量的数据保护, 防止数据未经授权的泄露和未被察觉的修改: ☆具有相当高的 复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握: ☆DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础: ☆实现经济,运行