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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章