2

HID Omnikey 5321 リーダーを使用して、Mifare DESFire EV1 タグと通信しています。標準データファイルに 16 バイトを書き込みたい。WinSCard DLL (C++) を使用して、ネイティブ DESFire コマンドを ISO 7816 APDU メッセージ構造にラップしています。アプリケーションの選択と認証は正常に行われましたが、Write Data コマンドに問題があります。ファイルの通信設定は、完全に暗号化された AES に設定されています。

File Nb         : 00
Offset          : 00 00 00
Length          : 10 00 00 (LSB first)
Data (16 bytes) : 23 00 00 00 00 00 00 08 12 34 56 78 00 00 00 00

Native コマンドから CRC を計算します。

Native command : 3D (File Nb) (Offset) (Length) (Data)
CRC = 7B 8A 60 0F 

次に、セッション キーと IV を 00 に設定して暗号化します。

32 bytes data to encipher : (Data) (CRC) 80 00 00 00 00 00 00 00 00 00 00 00

APDU が送信されました:

90 3D 00 00 27 00 00 00 00 10 00 00 (32 bytes enciphered data) 00

応答として、CRC またはパディング エラーを意味する「 1E 」ステータス コードを取得します。どこに問題があるのか​​わかりませんが、なんとかデータを読み取れるので、AES 暗号化アルゴリズムは良さそうです。

それはCRCかIVかもしれません。CMAC でデータを XOR する必要がありますか?

4

1 に答える 1

2

使用している CRC が間違っています。質問に表示するコマンドの場合、コマンド + ヘッダー + データの CRC は30 D2 07 00.

さらに、パディングを行う方法にも注意してください。DESFire EV1 のデータシートは、それに関してあいまいです。AES 暗号化に関するセクションでは、CMAC パディングを常に AES と一緒に使用する必要があることを示唆していますが、パディングに関するセクションでは、既知のデータ長を持つコマンドはすべてゼロでパディングする必要があり、データ長が不明なコマンドは0x80その後にゼロをパディングする必要があると述べています。最後に、書き込みコマンドのドキュメントには、暗号化のために書き込みコマンドにすべてゼロを埋め込む必要があることが明示的に記載されています (これが本来の目的です)。

于 2014-05-16T20:57:28.140 に答える