天天看點

射頻識别技術漫談(19)——Desfire的3次握手認證和段密碼生成

并生成臨時的通訊密鑰在通訊技術中的應用非常普遍,mifare

desfire也使用了這種成熟的認證加密方法。desfire在卡片資料傳輸前使用des或3des進行3次握手認證,認證成功一方面表明卡片和讀寫器雙方是可以互相信任的,同時為雙方之後的資料傳送提供了一組臨時使用的段密碼進行加密保護。

    des/3des的基本運算包括加密和解密,desfir卡片規定,當讀寫器(pcd)與卡片(picc)進行des/3des運算時,卡片總是進行加密運算,與之對應,讀寫器總是進行解密運算。des密鑰有16個位元組,如果前8個位元組與後8個位元組相同,則進行des運算,反之如果前8個位元組和後8個位元組不同,則進行3des運算。如下表所示:

使用密鑰

picc

pcd

key1:3des密鑰的前8個位元組

加密

解密

key2:3des密鑰的後8個位元組

key3:3des密鑰的前8個位元組

    des/3des運算每次操作8位元組,如果資料不足8位元組,必須填充為8位元組,填充的資料通常是00,如果正好要進行des運算的資料是“00

00 00”(比如“讀取所有資料”指令),則填充一個0x80,後面再填充00。

    所有的des/3des操作使用密碼塊連結模式(cbc),即上一次des運算的結果作為下一次運算的初始向量。發送資料使用發送cbc模式,接收資料使用接收cbc模式。第一次運算的初始向量規定為8位元組的00.

    以下描述3次握手認證和段密碼産生的過程及執行個體,假設卡片密碼為16個00:

    第一步:讀寫器作為發起認證的主導方,向卡片發送認證(authenticate)指令,并攜帶一個表示密碼序号的參數(卡片上每種應用可以最多有14組不同的密碼,其序号為0-d)。如果標明的應用辨別符aid為0,那麼認證将指向卡片的主密碼(卡片密鑰),在此情況下,密碼序号必須為0。如果aid不為0,則認證的是某一應用的密碼。卡片進入磁場上電複位後将預設選中aid為0。也就是說卡片複位的首次密碼認證總是指向卡片主密碼。如果卡片上不存在指定的密碼組号,卡片将傳回一個錯誤碼。

    第二步:卡片用讀寫器指定的密碼加密一組8位元組的随機數rndb,例如rndb=98 e4 ee 2e 8b

4b f7 b1,加密方法使用des/3des,其結果用ek(rndb)表示,此處ek(rndb)=61 58 f4 51 8a 25 9b

00,并把ek(rndb)傳回給讀寫器。   

    第三步:讀寫器用待認證的密碼16個00,對收到的ek(rndb)進行des/3des解密進而得到rndb=98

e4 ee 2e 8b 4b f7

b1。接下來讀寫器對rndb進行8位閉合左循環,進而将第一個位元組移到了最後一個位元組的位置,結果記為rndb’,rndb’=e4 ee 2e 8b 4b f7

b1 98。然後讀寫器自己産生一個8位元組的随機數rnda,例如rnda=00 11 22 33 44 55 66

77,并與rndb’連接配接起來組成rnda+rndb’=00 11 22 33 44 55 66 77 e4 ee 2e 8b 4b f7 b1

98共16位元組,使用cbc模式的des/3des解密運算,得到的結果稱為dk(rnda+rndb’)=74 f4 ae 77 7a a4 31 e8 4b 18

ba 8f 74 cf 80 63發送給卡片。

    第四步:卡片收到16位元組dk(rnda+rndb’)後執行des/3des加密運算,得到結果rnda+rndb’。卡片首先将自己原來的rndb大循環左移8位,看結果是否等于rndb’,如果不相等,卡片将停止認證過程,并回送一個錯誤碼。如果相等,證明卡片使用的密碼和讀寫器使用的密碼一緻,卡片将獲得的rnda也大循環左移8位得到rnda’=11

22 33 44 55 66 77 00,然後對rnda’進行des/3des加密運算,得到的結果稱為ek(rnda’)=f1 81 f7 32 6d cd

86 a6回送給讀寫器。

    第五步:讀寫器收到ek(rnda’)後執行des/3des解密進而得到rnd

a’,并把自己之前産生的rnda大循環左移8位,得到的結果與rnd a’比較,如果不相等,讀寫器将退出認證過程并可将卡片休眠。

    第六步:卡片将目前的應用設定為通過認證狀态,如果aid=0,則将卡片本身設定為通過認證狀态。

    第七步:如果雙方所有的比較都成功,通過組合rnda和rndb得到一個16位元組的段密碼,組合的方法如下:

              段密碼=rnda第一部分+rndb第一部分+

rnda第二部分+rndb第二部分

    對于本文中的例子,産生的段密碼為

00 11 22 33 98 e4 ee 2e 44 55 66 77 8b 4b f7 b1

    之是以采取這種組合方法産生段密碼是為了避免惡意的讀寫器通過将rnda=rndb而将3des運算強行轉化為des運算。如果之後的資料傳輸确實想使用單des操作(使段密碼的前8位元組與後8位元組相等),應使用前8個位元組,即rnda第一部分+rndb第一部分,而不能使用後8個位元組。

    得到16位元組的段密碼後,3次互相握手認證完成。如果之後的通訊是des/3des加密傳輸,則使用剛産生的16位元組段密碼作為臨時的des密鑰。

繼續閱讀