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