当前位置: 代码迷 >> 综合 >> ANSI X9.19 MAC算法的C语言实现
  详细解决方案

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

热度:48   发布时间:2023-12-28 20:13:58.0

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。

[cpp] view plain copy
  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);      
[cpp] view plain copy
  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  
  相关解决方案