mac是使用命令的全部元素(包含命令頭)產生的。一條命令的完整性,包含命令資料域(假設存在的話)中的資料元,通過安全報文傳送得以保證。依照例如以下的方式使用單重或三重dea加密方式產生mac:
第一步:取8個位元組的16進製制數字』0』作為初始變數。
第二步:依照順序將資料串聯在一起形成資料塊。
第三步:將該資料塊分成8位元組為單位的資料塊,標號為d1、d2、d3、d4等。最後的資料塊有可能是1-8個位元組。
第四步:假設最後的資料塊長度是8位元組的話,則在其後加上16進製制數字』80 00 00 00 00 00 00 00』,轉到第五步。
假設最後的資料塊長度不足8位元組,則在其後加上16進製制數字』80』,假設達到8位元組長度,則轉入第五步。否則在其後增加16進製制數字』0』直到長度達到8位元組。
第五步:對這些資料塊使用mac過程金鑰進行加密。
假設安全報文傳送支援單長度的mac dea金鑰,則按照下圖的方式使用mac 過程金鑰來產生mac。
第六步:終於得到是從計算結果左側取得的4位元組長度的mac。
memcpy(output, input, 8); if (1 == nkey) //單倍長key(8位元組) 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); } else //三倍長key(24位元組) 尚未驗證 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); } }
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的轉換關係了。
文/閆鑫原創
codevs等差數列
題目描述 description 給定n 1 n 100 個數,從中找出盡可能多的數使得他們能夠組成乙個等差數列.求最長的等差數列的長度.輸入描述 input description 第一行是乙個整數n,接下來一行包括了n個數,每個數的絕對值不超過10000000.輸出描述 output descr...
網易等差數列
如果乙個數列s滿足對於所有的合法的i,都有s i 1 s i d,這裡的d也可以是負數和零,我們就稱數列s為等差數列。小易現在有乙個長度為n的數列x,小易想把x變為乙個等差數列。小易允許在數列上做交換任意兩個位置的數值的操作,並且交換操作允許交換多次。但是有些數列通過交換還是不能變成等差數列,小易需...
演算法 等差數列
原理 如果乙個數列從第二項起,每一項與它的前一項的差等於同乙個常數,這個數列就叫做等差數列,這個常數叫做等差數列的公差,公差常用字母d表示。等差數列是常見數列的一種,如果乙個數列從第二項起,每一項與它的前一項的差等於同乙個常數,這個數列就叫做等差 數列,而這個常數叫做等差數列的公差,公差常用字母d表...