演算法系列6——MAC

來源:互聯網
上載者:User

標籤:des   style   blog   color   os   資料   for   2014   

GP中定義的MAC可以和PBOC中的MAC通過簡單計算相互轉換,如下:

 

DATA=84820000100102030405060708800000
ICV=0000000000000000
KEY=404142434445464748494A4B4C4D4E4F

安全通道協議標識ALGSCP=02

 

3DES_MAC_1為PBOC中規定的計算MAC方法

3DES_MAC_1(ICV+DATA,KEY,MAC1)//MAC1=106729A5F51BFC24

 

 

GP_MAC為GP中規定的計算MAC方法,相當於CBC_MAC取後8位元組。

DATAL=LAST(DATA,16)
DATAB=COPY(DATA,1,16)
KEY1=COPY(KEY,1,16)
CBC_3DES_EN(ICV+DATAB,KEY1,_DATA)
XDATA=XOR(_DATA,DATAL)
GP_MAC(XDATA,KEY,MAC2)//MAC2=106729A5F51BFC24

 

 

在你仔細讀了下面PBOC_MAC源碼後,相信你就會理解上面GP_MAC和PBOC_MAC的轉換關係了。

 

void DoSSMac(const BYTE* input, intnInLen, const BYTE* key, int nKeyLen, BYTE* output)    {        BYTE byInitVec[8];   //初始向量        BYTE byTemp[8];        memset(byInitVec, 0x00,sizeof(byInitVec));        memset(byTemp,   0x00,sizeof(byTemp));        memcpy(byInitVec, input, 8);        BYTEbySubKey[3][16][48];        //秘鑰        memset(bySubKey, 0x01, sizeof(bySubKey));        int i = 0;        int j = (nInLen >> 3);        //構造並產生SubKeys        BYTE nKey = (nKeyLen >> 3) > 3 ?3 : (nKeyLen >> 3);        for (i = 0; i < nKey; i++)        {           SetSubKey(&bySubKey[i], &key[i << 3]);        }        memcpy(output, input, 8);        if (1 == nKey)    //單倍長Key(8位元組)        {            j--;            for (int i = 0; i <j; ++i)            {               Xor(input + 8 * (i + 1), output, 8, output);               RunDes(output, 0, &bySubKey[0], output);               //memcpy(byInitVec, output, 8);           //將輸出設定為扭轉變數            }        }      <span style="color:#ff0000;"> //轉換關係就在這裡       else if (2 == nKey)    //雙倍長Key(16位元組)        {                  j -= 2;            for (i = 0; i < j;++i)            {               Xor(input + 8 * (i + 1), output, 8, output);               RunDes(output, 0, &bySubKey[0],output);       //將輸出設定為扭轉變數                }            Xor(input + 8 * (++i),output, 8, output);        //最後一塊資料和上面加密結果異或            RunDes(output, 0,&bySubKey[0], output);            RunDes(output, 1,&bySubKey[1], output);            RunDes(output, 0,&bySubKey[0], output);        }</span>        else  //三倍長Key(24位元組)   尚未驗證        {            //j -= 2;            for (i = 0, j =(nInLen >> 3) - 2; i < j; ++i, input += 8)            {               Xor(input + 8 * (i + 1), output, 8, byTemp);               RunDes(byTemp, 0, &bySubKey[0], output);               memcpy(byInitVec, output, 8);           //將輸出設定為扭轉變數            }            Xor(input + 8 * i,output, 8, output);            RunDes(output, 2,&bySubKey[0], output);            RunDes(output, 1,&bySubKey[1], output);            RunDes(output, 0,&bySubKey[0], output);        }    } 


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.