2016-07-09 53 views
8

在Stackoverflow上,有關於Desfire EV1卡的很多問題。 但是,如果您搜索一些示例數據,您將只能找到幾個字節的地方是Ridrix Blog。但這是相當不完整的。Desfire EV1通信示例

很多人寫了他們的問題有而DESFire門禁卡開發代碼。但大多數時候,當他們解決他們的問題時,他們懶得發佈解決方案。所以你會發現很多問題,但很少有數據例子的答案。

即使你有DESFIRE EV1文檔(我沒有它,我研究easypay代碼),你將需要不止於此。文件只是理論。但是,您的網卡返回認證錯誤或完整性錯誤或意外CMAC的原因是什麼?

  • 是會話鍵OK?
  • CBC是否在正確的模式下工作?
  • CMAC計算是否正確?
  • CRC32是否正確?
  • 函數調用之前/之後會話密鑰的IV是否正確?

沒有例子你完全喪失。

回答

13

與DESFIRE EV1開發花費幾個星期後,我決定後,所有這些誰需要輸入數據與預期數據來養活自己的複雜cryprographic功能和比較輸出的一些例子。我知道這非常有幫助。

您可以找到最重要的DESFire EV1操作一些調試輸出。 目前您無法在互聯網上找到此信息。 如果我有這些例子,我會省下很多時間來開發我的代碼。

陷阱的ISO和AES驗證的會話

在ISO和AES模式來說,每一加密/解密經過CBC。 會話密鑰的IV僅在驗證後創建密鑰時才被重置爲零。 身份驗證密鑰的IV僅在身份驗證開始時重置爲一次。

在認證期間:

  1. 隨機B從與RECEIVE +破譯
  2. 隨機AB被髮送到與SEND +加密器卡與接收
  3. 隨機甲卡接收RECEIVE +破譯

CMAC是會話密鑰IV的副本。 CMAC必須主要計算髮送給卡的數據和從卡返回的數據。 但是所有執行CBC加密的命令(例如ChangeKeySettings)都不同於該方案。 發送/接收多個幀的命令(例如,GetApplicationIDs)必須通過已發送/接收的所有幀的數據(不包括0xAF狀態字節)計算CMAC。 對於TX數據,通過命令字節+所有參數字節計算CMAC。 對於RX數據,計算CMAC的所有響應字節+最後一個狀態字節(總是00 =成功),必須在最後附加!

認證是無效

  • 當錯誤occures(!狀態= 00和= AF),
  • 執行SelectApplication時,
  • 後相同的密鑰已被更改這是用於驗證,
  • 當另一張卡進入RF領域(不要忘記重置您的變量)。

在這些情況下,會話密鑰不再有效,因此不能計算CMAC。

該新密鑰的CRC32僅計算關鍵數據本身。 密碼的CRC32是根據命令,密鑰號和尚未加密的密碼計算的。

下面的調試輸出已經由我的代碼在Teensy 3.2中使用Adafruit的PN532板卡生成。 欲瞭解更多詳情,請參閱我的source code。 源代碼是爲Arduino/Teensy編寫的,但它已被設計爲多平臺,因此它只需要更改幾行即可在Visual Studio,Linux或其他平臺上編譯它。

在以下示例中,所有密鑰都具有密鑰版本0x10。

ISO認證與2K3DES默認密鑰#0

*** Authenticate(KeyNo= 0, Key= 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (DES)) 
Sending: <1A 00> 
Response: <AF B8 90 04 7F 2D C8 D6 8B> 
* RndB_enc: B8 90 04 7F 2D C8 D6 8B 
* RndB:  74 B8 43 5F CB A0 B6 75 
* RndB_rot: B8 43 5F CB A0 B6 75 74 
* RndA:  92 31 34 8B 66 35 A8 AF 
* RndAB:  92 31 34 8B 66 35 A8 AF B8 43 5F CB A0 B6 75 74 
* RndAB_enc: 7C 84 6A 50 7B 9B 6E 68 64 BC 33 72 A3 06 A8 C1 
Sending: <AF 7C 84 6A 50 7B 9B 6E 68 64 BC 33 72 A3 06 A8 C1> 
Response: <00 B7 96 DD 3F 81 15 45 F3> 
* RndA_enc: B7 96 DD 3F 81 15 45 F3 
* RndA_dec: 31 34 8B 66 35 A8 AF 92 
* RndA_rot: 31 34 8B 66 35 A8 AF 92 
* SessKey: 92 30 34 8A 74 B8 42 5E 92 30 34 8A 74 B8 42 5E (DES) 

更改2K3DES默認密鑰#0

*** ChangeKey(KeyNo= 0) 
* SessKey:  B4 28 2E FA 9E B8 2C AE B4 28 2E FA 9E B8 2C AE (DES) 
* SessKey IV: 00 00 00 00 00 00 00 00 
* New Key:  00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 (2K3DES) 
* CRC Crypto: 0x5001FFC5 
* Cryptogram: 00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 C5 FF 01 50 00 00 00 00 
* CryptogrEnc: 87 99 59 11 8B D7 7C 70 10 7B CD B0 C0 9C C7 DA 82 15 04 AA 1E 36 04 9C 
Sending: <C4 00 87 99 59 11 8B D7 7C 70 10 7B CD B0 C0 9C C7 DA 82 15 04 AA 1E 36 04 9C> 
Response: <00> 

變化2K3DES默認密鑰#1

*** ChangeKey(KeyNo= 1) 
* SessKey:  9C 70 56 82 5C 08 9E C8 9C 70 56 82 5C 08 9E C8 (DES) 
* SessKey IV: 00 00 00 00 00 00 00 00 
* New Key:  00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 (2K3DES) 
* Cur Key:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (DES) 
* CRC Crypto: 0xD7A73486 
* CRC New Key: 0xC4EF3A3A 
* Cryptogram: 00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 86 34 A7 D7 3A 3A EF C4 
* CryptogrEnc: 7D 83 D3 4E FB 6C 84 98 48 E2 D6 37 AD A2 D0 87 14 36 1A E6 C4 63 14 52 
Sending: <C4 01 7D 83 D3 4E FB 6C 84 98 48 E2 D6 37 AD A2 D0 87 14 36 1A E6 C4 63 14 52> 
Response: <00 1D 5C 27 97 10 86 30 8D> 
CMAC:   1D 5C 27 97 10 86 30 8D 

ISO認證與3K3DES默認密鑰#0

*** Authenticate(KeyNo= 0, Key= 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (3K3DES)) 
Sending: <1A 00> 
Response: <AF 14 65 76 AC 1B 7D B8 CA 24 84 C5 69 7F 80 12 E1> 
* RndB_enc: 14 65 76 AC 1B 7D B8 CA 24 84 C5 69 7F 80 12 E1 
* RndB:  BA 91 37 BB 7A 18 33 E7 39 F0 5E 8F 07 87 D0 C4 
* RndB_rot: 91 37 BB 7A 18 33 E7 39 F0 5E 8F 07 87 D0 C4 BA 
* RndA:  F5 68 6F 3A 39 1C D3 8E BD 10 77 22 81 44 5B F6 
* RndAB:  F5 68 6F 3A 39 1C D3 8E BD 10 77 22 81 44 5B F6 91 37 BB 7A 18 33 E7 39 F0 5E 8F 07 87 D0 C4 BA 
* RndAB_enc: D0 55 BD 5E A0 1E BF C3 02 93 D4 8A 54 A0 51 B4 0A 66 57 7A 38 3C 58 ED 77 5C 51 BC 97 D4 FA BD 
Sending: <AF D0 55 BD 5E A0 1E BF C3 02 93 D4 8A 54 A0 51 B4 0A 66 57 7A 38 3C 58 ED 77 5C 51 BC 97 D4 FA BD> 
Response: <00 E1 EE 93 F0 12 C8 D6 72 11 D4 33 7C AD 56 6A 40> 
* RndA_enc: E1 EE 93 F0 12 C8 D6 72 11 D4 33 7C AD 56 6A 40 
* RndA_dec: 68 6F 3A 39 1C D3 8E BD 10 77 22 81 44 5B F6 F5 
* RndA_rot: 68 6F 3A 39 1C D3 8E BD 10 77 22 81 44 5B F6 F5 
* SessKey: F4 68 6E 3A BA 90 36 BA D2 8E BC 10 32 E6 38 F0 80 44 5A F6 06 86 D0 C4 (3K3DES) 

更改3K3DES默認密鑰#0

*** ChangeKey(KeyNo= 0) 
* SessKey:  F4 68 6E 3A BA 90 36 BA D2 8E BC 10 32 E6 38 F0 80 44 5A F6 06 86 D0 C4 (3K3DES) 
* SessKey IV: 00 00 00 00 00 00 00 00 
* New Key:  00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 70 60 50 40 30 20 10 00 (3K3DES) 
* CRC Crypto: 0xA2003ED6 
* Cryptogram: 00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 70 60 50 40 30 20 10 00 D6 3E 00 A2 00 00 00 00 
* CryptogrEnc: 7F 88 90 C7 CA B9 A4 22 81 73 A6 41 B6 5F 0F 43 FD 40 4A 01 13 71 A9 90 4A 62 9E 3C 20 B2 FF 63 
Sending: <C4 00 7F 88 90 C7 CA B9 A4 22 81 73 A6 41 B6 5F 0F 43 FD 40 4A 01 13 71 A9 90 4A 62 9E 3C 20 B2 FF 63> 
Response: <00> 

變化3K3DES默認密鑰#1

*** ChangeKey(KeyNo= 1) 
* SessKey:  9C 52 0E 3C B4 5A B2 A4 A2 00 C4 DA 72 2C 0E F4 38 FE 8A 48 F8 18 9E 56 (3K3DES) 
* SessKey IV: 00 00 00 00 00 00 00 00 
* New Key:  00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 70 60 50 40 30 20 10 00 (3K3DES) 
* Cur Key:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (3K3DES) 
* CRC Crypto: 0x078BAED8 
* CRC New Key: 0x12A6733E 
* Cryptogram: 00 10 20 31 40 50 60 70 80 90 A0 B0 B0 A0 90 80 70 60 50 40 30 20 10 00 D8 AE 8B 07 3E 73 A6 12 
* CryptogrEnc: 72 18 2F 5B 0C F1 7E A0 86 A5 AE A5 64 ED 98 7A F3 90 CD B3 78 36 4E 2B C2 45 8B 3A E3 23 98 4D 
Sending: <C4 01 72 18 2F 5B 0C F1 7E A0 86 A5 AE A5 64 ED 98 7A F3 90 CD B3 78 36 4E 2B C2 45 8B 3A E3 23 98 4D> 
Response: <00 D2 E3 BD 0D 09 47 72 ED> 
CMAC:   D2 E3 BD 0D 09 47 72 ED 

AE的認證與AES默認密鑰#0

*** Authenticate(KeyNo= 0, Key= 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (AES)) 
Sending: <AA 00> 
Response: <AF FF 0A FB 10 B4 3F 3B 34 23 36 57 0F 7A 0E 8B 74> 
* RndB_enc: FF 0A FB 10 B4 3F 3B 34 23 36 57 0F 7A 0E 8B 74 
* RndB:  1F 45 19 27 E7 C0 FC DE 60 9E E8 02 EF 69 76 04 
* RndB_rot: 45 19 27 E7 C0 FC DE 60 9E E8 02 EF 69 76 04 1F 
* RndA:  73 AE 5D 30 17 42 21 64 FB 16 25 D8 1F 2A 69 8C 
* RndAB:  73 AE 5D 30 17 42 21 64 FB 16 25 D8 1F 2A 69 8C 45 19 27 E7 C0 FC DE 60 9E E8 02 EF 69 76 04 1F 
* RndAB_enc: B3 11 34 03 F5 73 95 35 CA 1A 5D 4B D4 38 BE 03 2B 54 28 32 3D 0A 83 4D 11 8F 35 06 C4 2C 5B 01 
Sending: <AF B3 11 34 03 F5 73 95 35 CA 1A 5D 4B D4 38 BE 03 2B 54 28 32 3D 0A 83 4D 11 8F 35 06 C4 2C 5B 01> 
Response: <00 E2 AE 7D 31 29 48 19 69 E9 A0 C7 CC 89 1E DF 58> 
* RndA_enc: E2 AE 7D 31 29 48 19 69 E9 A0 C7 CC 89 1E DF 58 
* RndA_dec: AE 5D 30 17 42 21 64 FB 16 25 D8 1F 2A 69 8C 73 
* RndA_rot: AE 5D 30 17 42 21 64 FB 16 25 D8 1F 2A 69 8C 73 
* SessKey: 73 AE 5D 30 1F 45 19 27 1F 2A 69 8C EF 69 76 04 (AES) 

更改AES默認密鑰#0

*** ChangeKey(KeyNo= 0) 
* SessKey:  73 AE 5D 30 1F 45 19 27 1F 2A 69 8C EF 69 76 04 (AES) 
* SessKey IV: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
* New Key:  00 10 20 30 40 50 60 70 80 90 A0 B0 B0 A0 90 80 (AES) 
* CRC Crypto: 0x6BE6C6D2 
* Cryptogram: 00 10 20 30 40 50 60 70 80 90 A0 B0 B0 A0 90 80 10 D2 C6 E6 6B 00 00 00 00 00 00 00 00 00 00 00 
* CryptogrEnc: 97 41 8E 6C C0 1C 4E 6F AD 4D 87 4D 8D 42 5C EA 32 51 36 11 47 2C DA 04 E3 5E FB 77 9A 7D A0 E4 
Sending: <C4 00 97 41 8E 6C C0 1C 4E 6F AD 4D 87 4D 8D 42 5C EA 32 51 36 11 47 2C DA 04 E3 5E FB 77 9A 7D A0 E4> 
Response: <00> 

更改AES默認密鑰#1

*** ChangeKey(KeyNo= 1) 
* SessKey:  1C D3 8E BD 95 F3 1C 8A B8 7F 0A C9 C4 EB 64 C6 (AES) 
* SessKey IV: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
* New Key:  00 10 20 30 40 50 60 70 80 90 A0 B0 B0 A0 90 80 (AES) 
* Cur Key:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (AES) 
* CRC Crypto: 0x84B47033 
* CRC New Key: 0x1979E3BF 
* Cryptogram: 00 10 20 30 40 50 60 70 80 90 A0 B0 B0 A0 90 80 10 33 70 B4 84 BF E3 79 19 00 00 00 00 00 00 00 
* CryptogrEnc: 30 23 FA 06 2D 25 0A 04 35 BA E9 45 CA BE 96 5D 62 2A 47 1D 32 5D 1D 42 EA 81 44 41 CB 1A 20 C3 
Sending: <C4 01 30 23 FA 06 2D 25 0A 04 35 BA E9 45 CA BE 96 5D 62 2A 47 1D 32 5D 1D 42 EA 81 44 41 CB 1A 20 C3> 
Response: <00 9B 68 30 91 50 E0 72 5E> 
CMAC:   9B 68 30 91 50 E0 72 5E 

CMAC計算AES 128

來源:NIST

AES Key: 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c 
SubKey1: fb ee d6 18 35 71 33 66 7c 85 e0 8f 72 36 a8 de 
SubKey2: f7 dd ac 30 6a e2 66 cc f9 0b c1 1e e4 6d 51 3b 

Message: <empty> 
CMAC: bb 1d 69 29 e9 59 37 28 7f a3 7d 12 9b 75 67 46 

Message: 6b c1 be e2 2e 40 9f 96 e9 3d 7e 11 73 93 17 2a 
CMAC: 07 0a 16 b4 6b 4d 41 44 f7 9b dd 9d d0 4a 28 7c 

Message: 6b c1 be e2 2e 40 9f 96 e9 3d 7e 11 73 93 17 2a ae 2d 8a 57 1e 03 ac 9c 9e b7 6f ac 45 af 8e 51 30 c8 1c 46 a3 5c e4 11 
CMAC: df a6 67 47 de 9a e6 30 30 ca 32 61 14 97 c8 27 

如果您需要更多的例子(也CreateApplication,SelectApplication,DeleteApplication,GetApplicationIDs,GetKeyVersion,GetKeySettings,ChangeKeySettings,GetCardVersion,FormatCard,CreateStdDataFile,GetFileIDs,GetFileSettings,WriteFileData, ReadFileData,DeleteFile)下載ZIP文件Codeproject您可以在其中找到一個HTML文件,其中包含測試所有這些命令的整個selftest。

+0

Elmue一直在找幾個小時的項目。但似乎很多人沒有足夠的技巧來處理它。很多人(包括我)只想讀取存儲在Mifare EV1卡上的一些明文,而不是更多。你有沒有更小的例子可以分享?你在Codeproject上的一個是一個巨大的矯枉過正。無論如何真棒的工作有 –

+1

不,這不是過度殺傷。這是一個圖書館。如果你使用.NET框架,你也可以說有太多的類和函數是過時的。但是你只使用你需要的功能。你可以忽略其餘的。你不必瞭解加密是如何工作的。您只需將13個文件(除INO文件,UserManager和Classic以外)都包含到項目中,並且只需調用Desfire.cpp中的函數即可。你不必關心其他課程。有一個Desfire :: Selftest()函數顯示瞭如何使用這個類。你不會找到比我更簡單的項目。 – Elmue

+0

好吧我會試試看。感謝您的快速回答 –