ANSI-X99MAC算法和PBOC的3DES MAC算法,附DES算法工具

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /************************************************** 
  2. * PBOC-3DES MAC计算 
  3. **************************************************/  
  4. void PBOC_3DES_MAC( U08 *buf, U32 buf_size, U08 *key, U08 *mac_buf )  
  5. {  
  6.     U08 val[8],xor[8];  
  7.     U08 keyL[8],keyR[8];  
  8.     U08 block[512];  
  9.     U16 x,n;  
  10.     U16 i;  
  11.     memcpy(keyL,key,8);  
  12.     memcpy(keyR,&key[8],8);  
  13.     //准备工作  
  14.     memcpy( block, buf, buf_size ); //将输入数据赋值给临时变量block  
  15.     x = buf_size / 8; //计算有多少个完整的块  
  16.     n = buf_size % 8; //计算最后一个块有几个字节  
  17.     if( n != 0 )     //y非0,则在其后补上0x00...  
  18.     {  
  19.         memset( &block[x*8+n], 0x00, 8-n );  
  20.         block[x*8+n]=0x80;    
  21.     }  
  22.     else  
  23.     {  
  24.         memset( &block[x*8], 0x00, 8 );//如果最后一块长度是8个字节,则最后加80 00。。  
  25.         block[x*8]=0x80;  
  26.     }  
  27.     //开始运算  
  28.     memset( val, 0x00, 8 );//初始向量  
  29.     memcpy( val, UPPAN,8 );  
  30.     DataXOr(val,&block[0], 8,xor);  
  31.     for( i = 1; i < x+1; i++ )    //有多少块循环多少次  
  32.     {   
  33.         CurCalc_DES_Encrypt(keyL,xor,val);//DES加密  
  34.         DataXOr(val,&block[i*8], 8,xor);  
  35.         // j += 8;   //用于取下一块的数据  
  36.     }  
  37.     CurCalc_DES_Encrypt(keyL,xor,val);  
  38.     CurCalc_DES_Decrypt(keyR,val,xor);  
  39.     CurCalc_DES_Encrypt(keyL,xor,val);  
  40.     memcpy(mac_buf,val, 8 );  
  41. }  

只要有标准的DES加密和解密算法,类似ANSI-X99MAC算法和PBOC3DES算法就很好实现。他们都是用DES算法再经过一层算法实现的。实现原理看图就能看明白。3DES算法实现就更简单了。就是DES算法再加解密一次。


[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2. ************************************************************************************************************** 
  3. * 
  4. * 函数原型:void CurCalc_3DES_Encrypt( U08 *inkey, U08 *indata, U08 *outdata ) 
  5. * 
  6. * 函数功能:3DES加密 
  7. * 
  8. * 函数输入:inkey        16字节密码 
  9. *           indata      8字节需要加密的数据 
  10. *                 
  11. * 函数输出:outdata      8字节加密结果输出 
  12. * 
  13. * 函数返回:无 
  14. *    
  15. ************************************************************************************************************** 
  16. */  
  17. void CurCalc_3DES_Encrypt( U08 *inkey, U08 *indata, U08 *outdata )  
  18. {  
  19.     U08 LKey[8];  
  20.     U08 RKey[8];  
  21.     U08 TmpDest[8];  
  22.   
  23.     MyCopy( LKey, inkey,   8 );  
  24.     MyCopy( RKey, inkey+8, 8 );  
  25.   
  26.     CurCalc_DES_Encrypt( LKey, indata,  outdata );          //加  
  27.     CurCalc_DES_Decrypt( RKey, outdata, TmpDest );          //解  
  28.     CurCalc_DES_Encrypt( LKey, TmpDest, outdata );          //加  
  29. }  
  30.   
  31. /* 
  32. ************************************************************************************************************** 
  33. * 
  34. * 函数原型:void CurCalc_3DES_Decrypt( U08 *inkey, U08 *indata, U08 *outdata ) 
  35. * 
  36. * 函数功能:3DES解密 
  37. * 
  38. * 函数输入:inkey        8字节密码 
  39. *           indata      8字节需要解密的数据 
  40. *                 
  41. * 函数输出:outdata      8字节解密结果输出 
  42. * 
  43. * 函数返回:无 
  44. *    
  45. ************************************************************************************************************** 
  46. */  
  47. void CurCalc_3DES_Decrypt( U08 *inkey, U08 *indata, U08 *outdata )  
  48. {  
  49.     U08 LKey[8];  
  50.     U08 RKey[8];  
  51.     U08 TmpDest[8];  
  52.   
  53.     MyCopy( LKey, inkey,   8 );  
  54.     MyCopy( RKey, inkey+8, 8 );  
  55.   
  56.     CurCalc_DES_Decrypt( LKey, indata,  outdata );          //解  
  57.     CurCalc_DES_Encrypt( RKey, outdata, TmpDest );          //加  
  58.     CurCalc_DES_Decrypt( LKey, TmpDest, outdata );          //解  
  59. }  


[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /******************************************************* 
  2. * 名称:获取报文MAC值 
  3. * 功能:报文MAC算法 
  4. * 入口: 
  5. * *buf ,要计算的数据缓冲区;buf_size,计算数据的长度 
  6. * *key ,密钥(8B) 
  7. * 出口:mac_buf,计算出来的MAC值(8B) 
  8. ansi x9.9 MAC算法 
  9.  
  10. ********************************************************/  
  11. void Ansi99X_Get_MAC( U08 *buf, U32 buf_size, U08 *key, U08 *mac_buf )  
  12. {  
  13.     U08 val[8],xor[8];  
  14.     U08 block[512];  
  15.     U16 x,n;  
  16.     U16 i,j=0;  
  17.     //准备工作  
  18.     memcpy( block, buf, buf_size ); //将输入数据赋值给临时变量block  
  19.     x = buf_size / 8; //计算有多少个完整的块  
  20.     n = buf_size % 8; //计算最后一个块有几个字节  
  21.     if( n != 0 )     //y非0,则在其后补上0x00...  
  22.     {  
  23.         memset( &block[x*8+n], 0x00, 8-n );  
  24.         x += 1; //将补上的这一块加上去  
  25.     }  
  26.     //开始运算  
  27.     memset( val, 0x00, 8 );  
  28.     for( i = 0; i < x; i++ )  //有多少块循环多少次  
  29.     {  
  30.         DataXOR(val,&block[j], 8,xor);  
  31.         CurCalc_DES_Encrypt(key,xor,val);//DES加密  
  32.         j += 8;  //用于取下一块的数据  
  33.     }  
  34.     memcpy(mac_buf,val, 8 );  
  35. }  

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /* 
  2. ************************************************************************************************* 
  3. *  异或           
  4. ************************************************************************************************* 
  5. */  
  6. void DataXOR( U08 *source, U08 *dest, U32 size, U08 *out )  
  7. {  
  8.    int i;  
  9.    for( i = 0; i < size; i++ )  
  10.    { out[i] = dest[i] ^ source[i]; }  
  11. }  

实现MAC算法的原理,可以参考CPU卡指令手册或PBOC规范。如图:

MAC的计算:

3DES算法计算MAC

DES算法工具:


下载:https://maxwoods.ctfile.com/fs/yNM165157404

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值