ansi x9.9 MAC算法(轉載)

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 ;
}

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