MAC算法
void xor(unsigned char *input1,unsigned char *input2,unsigned char *output,int len)
{
while (len) {
*output++=*input1++^*input2++;
len--;
}
}
/*
*@brief: 根据输入数据计算MAC,初始IV向量默认为"x00x00x00x00x00x00x00x00"
*@param: sMacKey 密钥
*@param: pInData 输入数据
*@param: iInLen 输入数据长度
*@param: pRetData 计算出来的MAC
*@调用自定义xor和des函数
*/
void MacArithmetic(unsigned char *sMacKey,unsigned char *pInData,int iInLen,unsigned char *pRetData)
{
//MAC算法:
//将字符串pInata分为8字节为单位的数据块,不足补x00,分别标号为D1,D2,D3,...,Dn
//设置初始向量E0="x00x00x00x00x00x00x00x00"
//将E0^D1 —---->E1(E0,D1异或的后结果经des加密得到E1)
//将E1^D2 ----->E2
//如此类推,知道得出En结束,En即是计算出来的MAC
unsigned char sUpData[512];
unsigned char sData[20];
unsigned char sXorData[20];
unsigned char sDesData[20];
int i,n,iNum;
memset(sUpData,0,sizeof(sUpData));
memset(sData,0,sizeof(sData));
memset(sXorData,0,sizeof(sXorData));
memset(sDesData,0,sizeof(sDesData));
//补全要加密数据成8倍数到sUpData,不足补x00
memcpy(sUpData,pInData,iInLen);
iNum = iInLen%8;
if (iNum == 0)
n=iInLen/8;
else {
n=iInLen/8+1;
memcpy(sUpData+iInLen,"x00x00x00x00x00x00x00x00",8-iNum);
}
printf("n=%dnsUpData=[%s]n",n,sUpData);
//轮循异或,加密
memcpy(sDesData,"x00x00x00x00x00x00x00x00",8); //初始向量赋给sDesData
for(i=0;i<n;i++)
{
//拷贝sUpData中下一个8位到sData
memcpy(sData,sUpData+i*8,8);
xor(sDesData,sData,sXorData,8); //异或
Des(sXorData,sDesData,sMacKey,1); //des加密
}
memcpy(pRetData,sDesData,8);
return ;
}