POS DES MAC 算法

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

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);

相关文章
|
7月前
|
算法 安全 C语言
使用C语言实现DES算法代码
使用C语言实现DES算法代码
217 0
|
4月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
189 1
|
5月前
|
算法 安全 网络安全
信息安全: MAC(消息认证码)算法,保护数据完整性和真实性的利器
MAC 算法在保证数据完整性和真实性方面扮演着重要角色。HMAC 和 CMAC 作为两种主要的 MAC 算法,因其高安全性和广泛应用,已经成为现代通信和数据保护中不可或缺的一部分。通过本文的介绍,希望读者能够更好地理解和使用 MAC 算法,保障信息的安全性。
|
6月前
|
存储 算法 安全
深入解析消息认证码(MAC)算法:HmacMD5与HmacSHA1
深入解析消息认证码(MAC)算法:HmacMD5与HmacSHA1
|
6月前
|
存储 算法 安全
Java中的DES和3DES加密算法详解
Java中的DES和3DES加密算法详解
|
7月前
|
安全 算法 数据库
MD5、SHA、DES、AES、RSA的算法说明
【5月更文挑战第10天】MD5、SHA、DES、AES、RSA的算法说明
365 2
|
7月前
|
算法 Android开发
安卓逆向 -- 自吐算法(MAC)
安卓逆向 -- 自吐算法(MAC)
54 1
|
7月前
|
算法 JavaScript Java
安卓逆向 -- 算法基础(MAC)
安卓逆向 -- 算法基础(MAC)
34 1
|
7月前
|
算法 Android开发
安卓逆向 -- 自吐算法(DES)
安卓逆向 -- 自吐算法(DES)
34 0
|
3月前
|
iOS开发 MacOS Windows
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错
Mac air使用Boot Camp安装win10 ,拷贝 Windows 文件时出错