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。
- if(lc_len % DES_BLOCK_BYTES)
- {
- pad = DES_BLOCK_BYTES - (lc_len % DES_BLOCK_BYTES);
- MyMemset((void *)(&p_lc[lc_len]),0x80,pad);//后补 80
- lc_len += pad;
- }
- MyMemset((void *)(xor_oar),0,sizeof(xor_oar));
- tlen = lc_len / DES_BLOCK_BYTES;
- for(int i = 0;i < tlen;i++)
- {
- if(i == 0)
- {
- ret = LtcDesEncrptEcb(leftKey,plc,DES_KEY_BYTES,xor_oar);
- if(ret != 0)
- return ret;
- }
- else
- {
- for(int j = 0;j < DES_BLOCK_BYTES;j++)
- {
- xor_oar[j] ^= plc[j];
- }
- ret = LtcDesEncrptEcb(leftKey,xor_oar,DES_KEY_BYTES,temp_buf);//用左半部加密
- if(ret != 0)
- return ret;
- MyMemcpy((void *)(xor_oar),temp_buf,DES_KEY_BYTES);
- }
- plc += DES_BLOCK_BYTES;
- }
- ret = LtcDesDecrptEcb(rightKey,xor_oar,DES_KEY_BYTES,temp_buf);//用右半部解密
- PrvAlgErrDo(((ret != RT_OK)),PRVALG_SW_CORE_ERR);
- ret = LtcDesEncrptEcb(leftKey,temp_buf,DES_KEY_BYTES,xor_oar);//再用左半部加密
- PrvAlgErrDo(((ret != RT_OK)),PRVALG_SW_CORE_ERR);
- MyMemcpy((void *)(temp_buf),xor_oar,MAC_BYTES);
- PrvAlgSuccessDo(temp_buf,MAC_BYTES);
- 主密钥: 1112131415161718 8877665544332211
- 4F82C236D0A485F1
- 1.主密钥左半部加密D0
- 1112131415161718 加密 4F82C236D0A485F1 得:
- B32E3DD445075160
- 2.将1中加密结果与 0000000000000000 异或得:
- B32E3DD445075160
- 3.用密钥左半部加密
- 1AE4CF2CB947BEFD
- 4.用密钥右半部解密
- EDD2897CDAA3699C
- 5.用左半部再加密
- 995BCF6E09029500
- 6.取左半部得MAC
- 995BCF6E