2014-05-13 3 views
2

Mifare DESFire EV1 태그와 통신하기 위해 HID Omnikey 5321 리더를 사용하고 있습니다. 16 바이트를 표준 데이터 파일에 쓰고 싶습니다. WinSCard DLL (C++)을 사용하여 ISO 7816 APDU 메시지 구조에서 네이티브 DESFire 명령을 래핑합니다. 응용 프로그램 선택 및 인증이 성공적으로 완료되었지만 데이터 쓰기 명령에 문제가 있습니다. 파일의 통신 설정이 AES로 설정되어 완전히 암호화됩니다. NFC 통신 - Mifare DESFire EV1 - 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 

나는 원주민 명령에서 CRC를 계산 :

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

APDU 발송에 실패 :

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

나는 00 세션 키와 IV 세트 암호화하기

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

응답으로 "1 E "상태 코드는 CRC 또는 패딩 오류를 의미합니다. 나는 어디에서 문제인지 알지 못한다. AES 암호화 알고리즘은 데이터를 읽을 수 있기 때문에 좋은 것처럼 보인다.

CRC 또는 IV 일 수 있습니다. CMAC와 XOR 데이터를 사용해야합니까?

+0

CRC는 다른 바이트 순서를 가질 수 있습니까? –

+0

libfreefare CRC 계산에서 해당 명령 + 헤더 + 데이터에 대해'30 D2 07 00'을 보냈습니다. 또한 데이터 시트는 적어도 알려진 데이터 길이를 가진 명령은 패딩에 '0x00'만 사용해야한다고 말합니다. (데이터 시트의 다른 섹션은 여기에 모호하지만, 쓰기 명령에 대해서는 명시 적으로 상태임을 인정해야합니다). –

+0

도움을 주셔서 감사합니다. 데이터를 쓸 수 있습니다. CRC를 계산하는 방식을 변경하고 '30 D2 07 00 '을주었습니다. 또한'0x00 '으로 채 웁니다. – VTerrien

답변

2

사용중인 CRC가 잘못되었습니다. 질문에 표시되는 명령의 경우 command + header + data에 대한 CRC는 30 D2 07 00이어야합니다.

또한 패딩을 수행하는 방법에주의하십시오. DESFire EV1 데이터 시트는 이에 대해 모호합니다. AES 암호화에 대한 절에서는 CMES 패딩을 항상 AES와 함께 사용해야한다고 설명하지만 패딩 섹션에서는 알려진 데이터 길이의 명령에 모두 0으로 채워야하며 알 수없는 데이터 길이의 명령에는 0x80으로 채워야하며 그 뒤에 0 . 마지막으로 write 명령에 대한 문서는 write 명령이 암호화를 위해 모두 0으로 채워 져야한다고 명시 적으로 명시하고 있습니다.

+0

기존 파일에 데이터를 쓸 수 있지만 응용 프로그램에서 파일을 만들면 "1E"상태 코드가 표시됩니다. – VTerrien

+0

잘못된 IV 인 것 같아요. 어떻게 계산해야합니까? 그것은 00로 설정해야합니다 – VTerrien

+0

당신은 [그 대답] (http://stackoverflow.com/questions/20503060/how-to-decrypt-the-first-message-sent-from-mifare-desfire를 조사하고 싶을 수도 있습니다 -ev1/20504667 # 20504667) IV를 초기화하는 방법에 대해 설명합니다. 더욱이, libfreefare 구현을 살펴보면 필요한 기능을 대부분 (모든?) 제공 할 수 있으므로 제안하십시오. –

관련 문제