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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值