ANSI X9.19 MAC算法的C语言实现

本文详细介绍了ANSIX9.19MAC算法的执行步骤,包括数据分组、密钥使用和异或操作等。通过示例展示了如何使用双倍长密钥进行加密和解密过程,以及最终生成MAC值的步骤。内容涵盖了MAC数据的填充、加密解密过程以及关键操作的C++代码实现。
摘要由CSDN通过智能技术生成

ANSI X9.19 MAC算法的基本思路:

1.ANSI X9.19MAC算法只使用双倍长密钥(不小于16)。

2.MAC数据先按8字节分组,表示为D0~Dn,如果Dn不足8字节时,尾部以字节00补齐。

3.用MAC密钥左半部加密D0,加密结果与D1异或作为下一次的输入。

4.将上一步的加密结果与下一分组异或,然后用MAC密钥左半部加密。

5.循环操作直至所有分组结束。

6.用MAC密钥右半部解密5的结果,然后再用MAC密钥左半部加密。

7. 取6的结果的左半部作为MAC。

  1.    
  2.         if(lc_len % DES_BLOCK_BYTES)  
  3.         {  
  4.             pad = DES_BLOCK_BYTES - (lc_len % DES_BLOCK_BYTES);  
  5.             MyMemset((void *)(&p_lc[lc_len]),0x80,pad);//后补 80  
  6.             lc_len += pad;  
  7.         }         
  8.         MyMemset((void *)(xor_oar),0,sizeof(xor_oar));  
  9.         tlen = lc_len / DES_BLOCK_BYTES;      
  10.         for(int i = 0;i < tlen;i++)  
  11.         {  
  12.             if(i == 0)  
  13.             {  
  14.                 ret = LtcDesEncrptEcb(leftKey,plc,DES_KEY_BYTES,xor_oar);  
  15.                 if(ret != 0)  
  16.                   return ret;  
  17.             }  
  18.             else  
  19.             {  
  20.                 for(int j = 0;j < DES_BLOCK_BYTES;j++)  
  21.                 {  
  22.                     xor_oar[j] ^= plc[j];  
  23.                 }  
  24.                 ret = LtcDesEncrptEcb(leftKey,xor_oar,DES_KEY_BYTES,temp_buf);//用左半部加密  
  25.                 if(ret != 0)  
  26.                   return ret;  
  27.                 MyMemcpy((void *)(xor_oar),temp_buf,DES_KEY_BYTES);  
  28.             }  
  29.             plc += DES_BLOCK_BYTES;  
  30.         }  
  31.         ret = LtcDesDecrptEcb(rightKey,xor_oar,DES_KEY_BYTES,temp_buf);//用右半部解密  
  32.         PrvAlgErrDo(((ret != RT_OK)),PRVALG_SW_CORE_ERR);  
  33.         ret = LtcDesEncrptEcb(leftKey,temp_buf,DES_KEY_BYTES,xor_oar);//再用左半部加密  
  34.         PrvAlgErrDo(((ret != RT_OK)),PRVALG_SW_CORE_ERR);  
  35.         MyMemcpy((void *)(temp_buf),xor_oar,MAC_BYTES);  
  36.           
  37.         PrvAlgSuccessDo(temp_buf,MAC_BYTES);      
  1. 主密钥: 1112131415161718 8877665544332211  
  2. 4F82C236D0A485F1  
  3. 1.主密钥左半部加密D0  
  4. 1112131415161718 加密 4F82C236D0A485F1 得:  
  5. B32E3DD445075160  
  6. 2.将1中加密结果与 0000000000000000 异或得:  
  7. B32E3DD445075160  
  8. 3.用密钥左半部加密   
  9. 1AE4CF2CB947BEFD  
  10. 4.用密钥右半部解密   
  11. EDD2897CDAA3699C  
  12. 5.用左半部再加密   
  13. 995BCF6E09029500  
  14. 6.取左半部得MAC  
  15. 995BCF6E  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值