ChameleonUltra & 스마트카드 비접촉 프로토콜 분석 정리
1. ChameleonUltra 개요
ChameleonUltra는 듀얼 모드 RFID 디바이스로, Tag Emulation과 Reader 두 가지 모드를 지원한다. (단, Reader 모드는 ChameleonUltra 전용 — Chameleon Lite는 미지원)
1.1 동작 모드
| 모드 | 기능 | 비고 |
|---|---|---|
| Tag Emulation | RFID 카드를 에뮬레이션 | HF + LF 동시 에뮬레이션 가능 |
| Reader | RFID 태그를 읽기/쓰기/공격 | Ultra 전용, HF/LF 순차 전환 |
1.2 지원 주파수 및 프로토콜
HF (13.56 MHz) Reader
| 프로토콜 | 읽기 | 쓰기 | 공격 | CLI 명령어 |
|---|---|---|---|---|
| ISO14443A | O | O | - | hf 14a scan |
| MIFARE Classic 1K/4K | O | O | O | hf mf ... |
| MIFARE Ultralight | O | - | - | hf mfu ... |
| NTAG (213/215/216) | O | - | - | hf mfu ... |
MIFARE Classic 공격: Darkside, Nested, Static Nested, Hard Nested
LF (125 kHz) Reader
| 태그 타입 | 읽기 | T55xx 쓰기 | CLI 명령어 |
|---|---|---|---|
| EM410x | O | O | lf em 410x read |
| HID Prox | O | O | lf hid prox read |
| Viking | O | O | lf viking read |
1.3 동시 동작 제약
| 동작 조합 | 가능 | 원인 |
|---|---|---|
| HF Reader 단독 | O | - |
| LF Reader 단독 | O | - |
| HF + LF 동시 읽기 | X | 명령별 순차 전환 |
| HF + LF 동시 에뮬레이션 | O | 별도 안테나/페리퍼럴 |
| Reader + Tag Emulation 동시 | X | HF 안테나 스위치 제약 |
하드웨어 원인: HF 안테나가 RF 스위치(HF_ANT_SEL, GPIO P1.10)로 RC522(Reader) 또는 nRF52840 NFCT(Tag Emulation) 중 하나에만 연결된다.
graph LR
ANT[HF 안테나 코일] --> SW{RF 스위치<br/>HF_ANT_SEL}
SW -->|LOW| RC[RC522<br/>Reader 칩]
SW -->|HIGH| NFC[nRF52840<br/>NFCT 페리퍼럴]
RC --> RM[Reader 모드]
NFC --> TM[Tag Emulation 모드]
style SW fill:#f9f,stroke:#333
style RM fill:#cfc,stroke:#333
style TM fill:#ccf,stroke:#333
2. 스마트카드 인터페이스 규격
2.1 접촉식 (Contact) — ISO/IEC 7816
카드 표면에 금색 접점(8핀 금속 패드) 이 있는 방식.
| 핀 | 이름 | 기능 | 핀 | 이름 | 기능 |
|---|---|---|---|---|---|
| C1 | VCC | 전원 | C5 | GND | 접지 |
| C2 | RST | 리셋 | C6 | VPP | 프로그래밍 전압 |
| C3 | CLK | 클럭 | C7 | I/O | 데이터 |
| C4 | RFU | 예약 | C8 | RFU | 예약 |
| 표준 | 내용 |
|---|---|
| ISO 7816-1 | 물리적 특성 (카드 크기, 강도) |
| ISO 7816-2 | 접점 위치 및 크기 |
| ISO 7816-3 | 전기 인터페이스, 전송 프로토콜 (T=0, T=1) |
| ISO 7816-4 | 명령어 체계 (APDU 명령/응답) |
RF 주파수 없음 — 금속 접점으로 직접 전기 신호 전달
2.2 비접촉식 (Contactless) — ISO 14443
13.56 MHz 무선 RF를 사용하는 방식.
| 표준 | 내용 |
|---|---|
| ISO 14443-1 | 물리적 특성 |
| ISO 14443-2 | RF 전력 및 변조 (Type A / Type B) |
| ISO 14443-3 | 초기화, 안티콜리전, UID 선택 |
| ISO 14443-4 | 전송 프로토콜 (T=CL), RATS/ATS |
2.3 프로토콜 스택 비교
ISO 14443과 ISO 7816은 선택지가 아니라 계층적으로 쌓이는 레이어이다.
graph TB
subgraph 접촉식["접촉식 (금색 칩 꽂기)"]
CA[ISO 7816-4 APDU<br/>SELECT AID, READ RECORD]
CB[ISO 7816-3<br/>T=0 또는 T=1 직렬 전송]
CC[ISO 7816-1,2<br/>금속 접점 8핀]
CD[물리 접촉]
CA --> CB --> CC --> CD
end
subgraph 비접촉식["비접촉식 (NFC 탭)"]
NA[ISO 7816-4 APDU<br/>SELECT AID, READ RECORD]
NB[ISO 14443-4<br/>T=CL 비접촉 전송]
NC[ISO 14443A-3<br/>ATQA / SAK / UID]
ND[RF 13.56 MHz]
NA --> NB --> NC --> ND
end
CA -.-|동일한 APDU| NA
style CA fill:#ffe0b2,stroke:#e65100
style NA fill:#ffe0b2,stroke:#e65100
핵심: 맨 위의 APDU 명령어(ISO 7816-4)는 동일하고, 전달 방법만 다르다.
2.4 듀얼 인터페이스 카드
하나의 칩이 접촉식(ISO 7816)과 비접촉식(ISO 14443) 인터페이스를 모두 탑재한다.
graph TB
subgraph CARD["스마트카드 IC 칩"]
SE["Secure Element<br/>(애플리케이션)"]
APDU["ISO 7816-4 APDU 처리"]
SE --> APDU
APDU --> C_IF["ISO 7816-3<br/>접촉 T=1"]
APDU --> N_IF["ISO 14443-4<br/>비접촉 T=CL"]
C_IF --> PAD["금속 접점<br/>8핀 패드"]
N_IF --> COIL["안테나 코일"]
end
style SE fill:#fff9c4,stroke:#f57f17
style C_IF fill:#c8e6c9,stroke:#2e7d32
style N_IF fill:#bbdefb,stroke:#1565c0
하나의 칩, 하나의 앱, 두 개의 통로 — 꽂든 탭하든 같은 SE의 같은 애플리케이션에 접근한다.
3. Android HCE vs 물리 카드
3.1 비교
| 항목 | 물리 카드 (SE) | Android HCE |
|---|---|---|
| APDU 처리 위치 | 카드 내부 Secure Element | Android 앱 (HostApduService) |
| 보안 수준 | 하드웨어 보안칩 (탬퍼 방지) | 소프트웨어 기반 (루팅 시 노출) |
| 전원 필요 | 불필요 (리더 RF 전력 사용) | 필요 (폰 배터리) |
| UID | 고정 또는 랜덤 | 보통 랜덤 UID (보안 목적) |
| AID 라우팅 | 카드 자체가 AID 처리 | Android OS가 AID별로 앱에 라우팅 |
| 유연성 | 고정 (발급 후 변경 어려움) | 앱 업데이트로 자유롭게 변경 |
| 오프라인 동작 | 항상 가능 | 폰 꺼지면 불가능 |
3.2 에뮬레이션 범위 비교
graph LR
subgraph 프로토콜 스택
L1["ISO 14443A-3<br/>UID, MIFARE Classic, NTAG"]
L2["ISO 14443-4<br/>+ ISO 7816 APDU"]
end
CU["ChameleonUltra"] -->|지원| L1
CU -.->|미지원| L2
HCE["Android HCE"] -.->|미지원| L1
HCE -->|지원| L2
PC["물리 카드"] -->|지원| L1
PC -->|지원| L2
style CU fill:#c8e6c9,stroke:#2e7d32
style HCE fill:#bbdefb,stroke:#1565c0
style PC fill:#ffe0b2,stroke:#e65100
3.3 Android HCE 동작 구조
sequenceDiagram
participant R as NFC 리더
participant CLF as NFC Controller (CLF)
participant OS as Android NFC Service
participant APP as HostApduService 앱
R->>CLF: RF 필드 활성화 (13.56MHz)
CLF->>R: ATQA, UID, SAK (ISO 14443A-3)
R->>CLF: RATS (ISO 14443-4)
CLF->>R: ATS
R->>CLF: SELECT AID (APDU)
CLF->>OS: AID 라우팅
OS->>APP: processCommandApdu()
APP->>OS: Response APDU
OS->>CLF: Response APDU
CLF->>R: Response APDU
RF 프로토콜(L1~L3)은 동일하여 리더 입장에서 구분이 안 된다.
4. ChameleonUltra CLI로 카드 분석하기
4.1 기본 스캔
출력 항목:
| 필드 | 설명 |
|---|---|
| UID | 카드 고유 식별자 (4/7/10 바이트) |
| ATQA | Answer To Request Type A (2 바이트) |
| SAK | Select Acknowledge (1 바이트) — 카드 타입 판별 핵심 |
| ATS | Answer To Select (ISO 14443-4 지원 시에만 존재) |
4.2 SAK 값 해석표
| SAK | 카드 타입 | ISO 14443-4 | ChameleonUltra 에뮬레이션 |
|---|---|---|---|
| 0x00 | MIFARE Ultralight / NTAG 2xx | X | O |
| 0x08 | MIFARE Classic 1K / Plus SE 1K | X | O |
| 0x09 | MIFARE Mini 0.3K | X | O |
| 0x10 | MIFARE Plus 2K | X | - |
| 0x11 | MIFARE Plus 4K | X | - |
| 0x18 | MIFARE Classic 4K / Plus S 4K | X | O |
| 0x19 | MIFARE Classic 2K | X | O |
| 0x20 | DESFire EV1/2/3 / MIFARE Plus EV1/2 / NTAG 4xx | O | X |
| 0x28 | SmartMX + MIFARE Classic 1K | O | 부분적 (MF Classic 부분만) |
| 0x38 | SmartMX + MIFARE Classic 4K | O | 부분적 (MF Classic 부분만) |
SAK 비트 판별 기준
| 비트 | 마스크 | 의미 |
|---|---|---|
| bit 3 | 0x08 | MIFARE Classic 호환 |
| bit 5 | 0x20 | ISO 14443-4 지원 (ATS 자동 수신) |
4.3 SAK별 예상 결과
SAK = 0x08/0x18 — MIFARE Classic
- UID : A1B2C3D4
- ATQA : 0004
- SAK : 08
- ATS : (없음)
- Guessed type(s): MIFARE Classic 1K
- Mifare Classic technology
# Prng: WEAK
ChameleonUltra로 읽기/복제/에뮬레이션 가능
SAK = 0x20 — DESFire / MIFARE Plus
- UID : 04A1B2C3D4E5F6
- ATQA : 0344
- SAK : 20
- ATS : 0675338102806403
- Guessed type(s): DESFire EV1/EV2/EV3 | ...
ChameleonUltra로 UID만 확인 가능, 에뮬레이션 불가
SAK = 0x28 — SmartMX + MIFARE Classic 1K
SAK 0x28 = 0010 1000 (2진수) — bit 3 (0x08)과 bit 5 (0x20) 모두 설정됨.
비접촉 인터페이스 안에 두 개의 프로토콜이 공존하는 카드:
graph TB
subgraph SmartMX["SmartMX 칩 (SAK = 0x28)"]
subgraph MFC["MIFARE Classic 에뮬레이션"]
C1["Crypto1 (약한 보안)"]
C1A["구형 리더 접근"]
end
subgraph ISO["ISO 14443-4 + ISO 7816"]
C2["AES / 3DES / RSA (강한 보안)"]
C2A["신형 리더 접근"]
end
end
style MFC fill:#ffcdd2,stroke:#c62828
style ISO fill:#c8e6c9,stroke:#2e7d32
대표 사용 사례: NXP JCOP (Java Card), 공공기관 ID, 교통+출입+결제 통합 카드
| 영역 | ChameleonUltra | 설명 |
|---|---|---|
| MIFARE Classic 섹터 읽기 | O | Crypto1 인증, 키 크래킹 가능 |
| MIFARE Classic 복제 | O | 키를 알면 에뮬레이션 가능 |
| ISO 14443-4 APDU 통신 | X | ChameleonUltra 미지원 |
| SmartMX 보안 앱 접근 | X | APDU + 강한 암호 필요 |
SAK = 0x00 — MIFARE Ultralight / NTAG
hf mfu version으로 상세 확인 가능
4.4 분석 플로우차트
flowchart TD
START["hf 14a info 실행"] --> SAK{"SAK bit 5<br/>(0x20) 설정?"}
SAK -->|YES| ATS["ATS 있음<br/>ISO 14443-4 지원"]
SAK -->|NO| MFC{"MIFARE Classic<br/>감지?"}
ATS --> BOTH{"bit 3 (0x08)<br/>도 설정?"}
BOTH -->|YES| SMX["SAK = 0x28/0x38<br/>SmartMX + MF Classic<br/>MF Classic 부분만 공격 가능"]
BOTH -->|NO| DES["SAK = 0x20<br/>DESFire / Plus EV / NTAG 4xx<br/>ChameleonUltra 에뮬레이션 불가"]
MFC -->|YES| CLASSIC["SAK = 0x08/0x18<br/>MIFARE Classic"]
MFC -->|NO| UL["SAK = 0x00<br/>Ultralight / NTAG"]
CLASSIC --> PRNG["PRNG 유형 확인<br/>키 공격 → 복제/에뮬 가능"]
UL --> VER["hf mfu version<br/>정확한 모델 확인"]
style START fill:#e1bee7,stroke:#6a1b9a
style SMX fill:#ffcdd2,stroke:#c62828
style DES fill:#ffcdd2,stroke:#c62828
style CLASSIC fill:#c8e6c9,stroke:#2e7d32
style UL fill:#c8e6c9,stroke:#2e7d32
4.5 추가 분석 명령어
| 목적 | 명령어 | 설명 |
|---|---|---|
| Ultralight/NTAG 모델 확인 | hf mfu version |
GET_VERSION으로 칩 식별 |
| NXP 정품 서명 확인 | hf mfu signature |
ECC 서명 검증 |
| 전체 데이터 덤프 | hf mfu dump |
모든 페이지 읽기 |
| 수동 RATS 전송 | hf 14a raw -sc -d E080 |
ISO 14443-4 확인 |
| RATS + 필드 유지 | hf 14a raw -sc -d E080 -k |
후속 APDU 전송용 |
| SELECT AID 전송 | hf 14a raw -c -d 00A40400 -k |
ISO 7816 APDU 테스트 |
4.6 ChameleonUltra 비접촉 인터페이스 지원 요약
| 인터페이스 | 지원 | 비고 |
|---|---|---|
| 접촉식 (ISO 7816) | X | 물리적 접점 없음 |
| 비접촉식 HF (ISO 14443A-3) | O | 읽기/에뮬레이션 |
| 비접촉식 LF (125kHz) | O | 읽기/에뮬레이션 |
| ISO 14443-4 APDU | X | 상위 프로토콜 미지원 |
5. MIFARE Classic 출입카드를 Android 앱으로 대체할 수 있는가?
5.1 결론
표준 Android에서는 불가능하다. 근본적인 원인은 프로토콜 계층이 다르기 때문이다.
5.2 프로토콜 계층 불일치
graph TB
subgraph 출입리더["기존 출입 단말기"]
R1["ISO 14443A-3"]
R2["MIFARE Classic 인증<br/>(Crypto1)"]
R1 --> R2
end
subgraph 물리카드["MIFARE Classic 1K 카드"]
C1["ISO 14443A-3<br/>UID / ATQA / SAK"]
C2["Crypto1 응답<br/>(하드웨어 레벨)"]
C1 --> C2
end
subgraph Android["Android HCE"]
A1["ISO 14443A-3<br/>UID / ATQA / SAK"]
A2["ISO 14443-4 (ISO-DEP)"]
A3["HostApduService<br/>(APDU만 처리)"]
A1 --> A2 --> A3
end
R2 <-->|Crypto1 인증 성공| C2
R2 <-.->|Crypto1 인증 불가| A2
style C2 fill:#c8e6c9,stroke:#2e7d32
style A2 fill:#ffcdd2,stroke:#c62828
| 구분 | MIFARE Classic 카드 | Android HCE |
|---|---|---|
| 동작 계층 | ISO 14443A-3 | ISO 14443-4 |
| 인증 방식 | Crypto1 (HW 레벨) | APDU (SW 레벨) |
| SAK 응답 | 0x08 (Classic) | 0x20 (ISO-DEP) |
| 리더가 보내는 명령 | AUTH (0x60/0x61) | RATS (0xE0) → SELECT AID |
출입 리더는 카드에 Crypto1 인증 명령(0x60)을 보내는데, Android HCE는 이 명령을 수신 자체를 할 수 없다. HCE는 ISO 14443-4(ISO-DEP) 이후의 APDU만 처리 가능하다.
5.3 Android NFC 아키텍처의 한계
sequenceDiagram
participant R as 출입 리더
participant CLF as Android NFC 컨트롤러
participant OS as Android OS
participant APP as HCE 앱
R->>CLF: REQA (0x26)
CLF->>R: ATQA
R->>CLF: SELECT
CLF->>R: SAK = 0x20 (ISO-DEP만 지원)
Note over R: SAK=0x20 → MIFARE Classic이 아님
R->>CLF: AUTH 0x60 (MIFARE Classic 인증)
Note over CLF: Crypto1 에뮬레이션 불가<br/>명령 무시됨
R--xCLF: 인증 실패 → 출입 거부
핵심 문제:
| 문제 | 설명 |
|---|---|
| SAK 값 불일치 | Android는 SAK=0x20(ISO-DEP)으로 응답. 리더는 SAK=0x08(Classic)을 기대 |
| Crypto1 미지원 | NFC 컨트롤러가 MIFARE Classic 태그 에뮬레이션을 지원하지 않음 |
| OS 제약 | Android는 HCE를 ISO 14443-4 레이어에서만 노출. 하위 레이어 접근 차단 |
5.4 가능한 대안
flowchart TD
Q["MIFARE Classic 출입카드를<br/>모바일로 옮기고 싶다"]
Q --> A["방법 1<br/>단말기 교체"]
Q --> B["방법 2<br/>ChameleonUltra"]
Q --> C["방법 3<br/>특수 NFC 폰"]
Q --> D["방법 4<br/>듀얼 리더 설치"]
A --> A1["ISO 14443-4 기반 리더로 교체<br/>→ HCE 앱 사용 가능"]
B --> B1["ChameleonUltra에 카드 복제<br/>→ 디바이스를 카드 대신 사용"]
C --> C1["NXP SE 탑재 폰 + 제조사 협력<br/>→ 현실적으로 어려움"]
D --> D1["기존 리더 + HCE 리더 병행<br/>→ 과도기 운영"]
style A1 fill:#fff9c4,stroke:#f57f17
style B1 fill:#c8e6c9,stroke:#2e7d32
style C1 fill:#ffcdd2,stroke:#c62828
style D1 fill:#fff9c4,stroke:#f57f17
| 방법 | 단말기 교체 | 실현 가능성 | 설명 |
|---|---|---|---|
| HCE 앱 | 필요 (ISO 14443-4 리더로) | 높음 | 리더를 DESFire/HCE 호환으로 교체 |
| ChameleonUltra | 불필요 | 높음 | 카드 복제 후 에뮬레이션 (MIFARE Classic 대응) |
| NXP SE 폰 | 불필요 | 매우 낮음 | 제조사/통신사 협력 필요, API 비공개 |
| 듀얼 리더 | 추가 설치 | 중간 | 기존 Classic 리더 + HCE 리더 병행 |
5.5 요약
graph LR
MF["MIFARE Classic<br/>(ISO 14443A-3)"]
HCE["Android HCE<br/>(ISO 14443-4)"]
MF ---|프로토콜 계층이 달라<br/>호환 불가| HCE
style MF fill:#ffcdd2,stroke:#c62828
style HCE fill:#bbdefb,stroke:#1565c0
단말기 교체 없이 Android 앱만으로는 불가능하다. MIFARE Classic의 Crypto1 인증은 ISO 14443A-3 레벨에서 일어나고, Android HCE는 ISO 14443-4 레벨에서만 동작하기 때문이다.
단말기를 바꾸지 않고 모바일로 전환하려면, ChameleonUltra 같은 전용 에뮬레이션 하드웨어가 현실적인 유일한 방법이다.
6. ChameleonUltra를 출입 단말기로 교체할 수 있는가?
기존 MIFARE Classic 1K 출입 단말기를 ChameleonUltra로 교체하여 기존 카드와 Android HCE 앱을 동시 지원할 수 있는지 분석한다.
6.1 결론
적합하지 않다. 프로토콜, 하드웨어, 운영 방식 세 가지 레벨에서 모두 문제가 있다.
6.2 프로토콜 문제 — ISO 14443-4 전송 계층 부재
ChameleonUltra Reader 모드는 MIFARE Classic은 완벽히 지원하지만, Android HCE 통신에 필요한 ISO 14443-4 전송 계층이 펌웨어에 구현되어 있지 않다.
graph TB
subgraph 필요한것["출입 단말기에 필요한 기능"]
N1["MIFARE Classic 인증<br/>(Crypto1)"]
N2["ISO 14443-4 세션 관리<br/>(I-block, R-block, S-block)"]
N3["ISO 7816-4 APDU 교환<br/>(SELECT AID, 인증)"]
N1 ~~~ N2 --> N3
end
subgraph CU["ChameleonUltra Reader 지원 범위"]
S1["MIFARE Classic 인증 ✅"]
S2["RATS 전송 / ATS 수신 ✅"]
S3["hf 14a raw 바이트 전송 ✅"]
S4["ISO 14443-4 프로토콜 ❌<br/>I/R/S-block 프레이밍 없음"]
S5["APDU 자동 교환 ❌"]
end
style S1 fill:#c8e6c9,stroke:#2e7d32
style S2 fill:#c8e6c9,stroke:#2e7d32
style S3 fill:#c8e6c9,stroke:#2e7d32
style S4 fill:#ffcdd2,stroke:#c62828
style S5 fill:#ffcdd2,stroke:#c62828
hf 14a raw로 바이트 단위 전송은 가능하지만, ISO 14443-4에 필요한 다음 기능이 펌웨어에 없다:
| ISO 14443-4 필수 기능 | ChameleonUltra |
|---|---|
| I-block / R-block / S-block 프레이밍 | X |
| Block 번호 관리 및 토글 | X |
| Chaining (254바이트 초과 데이터) | X |
| WTX (Waiting Time Extension) 처리 | X |
| PPS (Protocol Parameter Selection) | X |
| FWT (Frame Waiting Time) 계산 | X |
6.3 하드웨어 문제 — 출입 단말기로 부적합
graph LR
subgraph 출입단말기["출입 단말기 요구사항"]
P1["24/7 상시 전원"]
P2["카드 자동 감지<br/>(폴링 루프)"]
P3["도어 릴레이 출력<br/>(GPIO/Wiegand)"]
P4["자율 동작<br/>(호스트 불필요)"]
end
subgraph CU2["ChameleonUltra 현실"]
C1["배터리 구동<br/>(연속 사용 시 방전)"]
C2["호스트 명령 필요<br/>(매 스캔마다 BLE/USB)"]
C3["릴레이 출력 없음<br/>(LED GPIO만 존재)"]
C4["자율 동작 불가<br/>(이벤트 드리븐 슬립)"]
end
P1 -.- C1
P2 -.- C2
P3 -.- C3
P4 -.- C4
style P1 fill:#c8e6c9,stroke:#2e7d32
style C1 fill:#ffcdd2,stroke:#c62828
style P2 fill:#c8e6c9,stroke:#2e7d32
style C2 fill:#ffcdd2,stroke:#c62828
style P3 fill:#c8e6c9,stroke:#2e7d32
style C3 fill:#ffcdd2,stroke:#c62828
style P4 fill:#c8e6c9,stroke:#2e7d32
style C4 fill:#ffcdd2,stroke:#c62828
| 요구사항 | ChameleonUltra | 비고 |
|---|---|---|
| 상시 전원 | X | 배터리 전용, 연속 Reader 모드 시 빠르게 방전 |
| 자동 카드 감지 | X | 호스트(BLE/USB)에서 매번 명령 필요 |
| 릴레이/Wiegand 출력 | X | 도어 컨트롤러 연결 불가 |
| 자율 동작 | X | 독립 실행 모드 없음, 반드시 호스트 필요 |
| 24/7 내구성 | X | 포터블 연구 도구로 설계됨 |
6.4 권장 구성 — MIFARE Classic + HCE 동시 지원
flowchart TD
subgraph 권장구성["권장: 멀티 프로토콜 전용 리더"]
DR["전용 NFC 리더 모듈<br/>(PN7150 / PN5180 등)"]
DR --> MF_OK["MIFARE Classic ✅"]
DR --> HCE_OK["ISO 14443-4 / HCE ✅"]
DR --> DC["도어 컨트롤러<br/>(Wiegand / OSDP)"]
DC --> DOOR["도어 릴레이"]
end
subgraph DIY구성["대안: Raspberry Pi + NFC 모듈"]
RPI["Raspberry Pi"]
NFC_MOD["PN532 / PN7150<br/>NFC 모듈"]
RPI --> NFC_MOD
NFC_MOD --> MF2["MIFARE Classic ✅"]
NFC_MOD --> HCE2["ISO 14443-4 / HCE ✅"]
RPI --> GPIO_R["GPIO → 릴레이"]
GPIO_R --> DOOR2["도어 릴레이"]
end
style DR fill:#c8e6c9,stroke:#2e7d32
style RPI fill:#bbdefb,stroke:#1565c0
style NFC_MOD fill:#bbdefb,stroke:#1565c0
| 구성 | MIFARE Classic | Android HCE | 상시 전원 | 릴레이 출력 | 난이도 |
|---|---|---|---|---|---|
| 전용 NFC 리더 (HID Signo 등) | O | O | O | O (Wiegand) | 낮음 |
| Raspberry Pi + PN532 | O | O | O | O (GPIO) | 중간 |
| Raspberry Pi + PN7150 | O | O | O | O (GPIO) | 중간 |
| ChameleonUltra | O | X | X | X | - |
6.5 요약
graph TB
Q{"ChameleonUltra로<br/>출입 단말기 교체?"}
Q -->|MIFARE Classic 읽기| YES["가능 ✅"]
Q -->|Android HCE 읽기| NO1["불가 ❌<br/>ISO 14443-4 미구현"]
Q -->|상시 운영| NO2["불가 ❌<br/>배터리/호스트 의존"]
Q -->|도어 제어| NO3["불가 ❌<br/>릴레이 출력 없음"]
style YES fill:#c8e6c9,stroke:#2e7d32
style NO1 fill:#ffcdd2,stroke:#c62828
style NO2 fill:#ffcdd2,stroke:#c62828
style NO3 fill:#ffcdd2,stroke:#c62828
ChameleonUltra는 RFID 연구/테스트 도구이지, 출입 단말기가 아니다. MIFARE Classic + HCE 동시 지원 출입 시스템을 구축하려면 PN7150/PN5180 기반 전용 NFC 리더 또는 Raspberry Pi + NFC 모듈 조합이 적합하다.
7. ChameleonUltra를 BLE 브릿지로 활용한 모바일 출입 지원
섹션 6에서 ChameleonUltra를 출입 단말기(리더)로 교체하는 것은 부적합하다고 결론지었다. 그러나 발상을 전환하여, 기존 출입 리더는 그대로 두고 ChameleonUltra를 리더 앞단에 BLE 수신 → MIFARE Classic 에뮬레이션 브릿지로 배치하는 구성은 가능하다.
7.1 아키텍처 개요
sequenceDiagram
participant APP as 모바일 앱
participant CU as ChameleonUltra<br/>(BLE + Tag Emulation)
participant RDR as 기존 MIFARE Classic<br/>출입 리더
participant DOOR as 도어 릴레이
Note over CU: 초기 상태: BLE 광고 중<br/>에뮬레이션 OFF
APP->>CU: 1. BLE 연결
APP->>CU: 2. UID/키/섹터 데이터 전송
APP->>CU: 3. 에뮬레이션 ON 명령
Note over CU: Tag Emulation 활성화<br/>(MIFARE Classic 1K)
RDR->>CU: 4. REQA (0x26)
CU->>RDR: ATQA (0x0004)
RDR->>CU: SELECT
CU->>RDR: SAK (0x08) + UID
RDR->>CU: AUTH (0x60) + 블록 번호
CU->>RDR: Nonce (nT)
RDR->>CU: NR ⊕ AR (Crypto1)
CU->>RDR: AT (Crypto1 응답)
Note over RDR: Crypto1 인증 성공!
RDR->>CU: 암호화된 READ
CU->>RDR: 암호화된 블록 데이터
RDR->>DOOR: 출입 허가
DOOR->>DOOR: 문 열림
APP->>CU: 5. 에뮬레이션 OFF (보안)
7.2 기술적 가능 근거
7.2.1 BLE + Tag Emulation 동시 동작
nRF52840 칩에서 BLE 라디오(2.4 GHz)와 NFCT 페리퍼럴(13.56 MHz)은 독립적으로 동작한다.
graph TB
subgraph nRF52840["nRF52840 SoC"]
CPU["ARM Cortex-M4F<br/>CPU"]
BLE["BLE Radio<br/>(2.4 GHz)"]
NFCT["NFCT 페리퍼럴<br/>(13.56 MHz)"]
CPU --> BLE
CPU --> NFCT
BLE ~~~ NFCT
end
APP2["모바일 앱"] <-->|BLE 2.4GHz| BLE
RDR2["출입 리더"] <-->|RF 13.56MHz| NFCT
style BLE fill:#bbdefb,stroke:#1565c0
style NFCT fill:#c8e6c9,stroke:#2e7d32
| 항목 | 상태 | 근거 |
|---|---|---|
| BLE 연결 중 Tag Emulation | O | 독립 페리퍼럴, 충돌 없음 |
| Tag Emulation 중 BLE 명령 수신 | O | 메인 루프에서 병렬 처리 |
| 모드 전환 시 BLE 끊김 | 없음 | BLE는 항상 유지됨 |
7.2.2 BLE로 카드 데이터 즉시 업데이트
에뮬레이션을 중지하지 않고도 RAM의 카드 데이터를 직접 수정할 수 있다.
| 명령 | 기능 | 에뮬레이션 재시작 필요 |
|---|---|---|
hf14a_set_anti_coll_data() |
UID, ATQA, SAK 변경 | 불필요 |
mf1_write_emu_block_data() |
블록 데이터 쓰기 (키 포함) | 불필요 |
set_active_slot() |
슬롯 전환 (8개 저장) | 불필요 |
set_slot_enable() |
에뮬레이션 ON/OFF | 불필요 |
7.2.3 MIFARE Classic 에뮬레이션 완전 지원
| 기능 | 지원 |
|---|---|
| Crypto1 인증 (Key A / Key B) | O |
| 16개 섹터 x 4블록 데이터 응답 | O |
| Access Control Bits 적용 | O |
| Value Block 연산 | O |
| Gen1A/Gen2 매직 카드 모드 | O |
7.2.4 에뮬레이션 ON/OFF 제어
stateDiagram-v2
[*] --> BLE_Idle: 전원 ON
BLE_Idle --> BLE_Connected: 앱 연결
BLE_Connected --> DataLoaded: 카드 데이터 전송
DataLoaded --> Emulating: set_slot_enable(ON)
Emulating --> DataLoaded: set_slot_enable(OFF)
Emulating --> Emulating: 리더 인증 처리
DataLoaded --> BLE_Idle: 앱 연결 해제
note right of Emulating
리더가 RF 필드 감지 시
자동으로 Crypto1 인증 응답
end note
note right of BLE_Idle
에뮬레이션 OFF 상태에서
물리 카드 통과 가능
end note
7.3 물리 카드와의 공존
에뮬레이션이 OFF일 때 ChameleonUltra 안테나는 고임피던스 상태가 되어 RF 필드를 차단하지 않는다.
flowchart LR
subgraph EMU_OFF["에뮬레이션 OFF"]
R1["출입 리더"] -->|RF 통과| CARD["물리 카드<br/>MIFARE Classic 1K"]
CU1["ChameleonUltra<br/>(안테나 비활성)"] -.->|간섭 없음| R1
end
subgraph EMU_ON["에뮬레이션 ON"]
R2["출입 리더"] -->|RF 인증| CU2["ChameleonUltra<br/>(MIFARE Classic 에뮬)"]
end
style CU1 fill:#eeeeee,stroke:#999
style CU2 fill:#c8e6c9,stroke:#2e7d32
style CARD fill:#ffe0b2,stroke:#e65100
| 상태 | 물리 카드 사용 | 모바일 앱 사용 |
|---|---|---|
| 에뮬레이션 OFF | O — RF 통과 | X |
| 에뮬레이션 ON | X — ChameleonUltra가 먼저 응답 | O |
7.4 전원 방식
| 전원 | 연속 운영 | BLE + Emulation | 비고 |
|---|---|---|---|
| USB 전원 | O | 무제한 | USB 연결 시 자동 슬립 방지 |
| 배터리 | 제한적 | 약 8~12시간 | BLE 광고 + 에뮬레이션 대기 |
| 배터리 + 온디맨드 | O | 수일 | 평시 슬립, 앱 연결 시만 활성 |
7.5 구현 예시 (Python 클라이언트)
# 1. BLE 연결
chameleon.connect()
# 2. 카드 데이터 로드
chameleon.hf14a_set_anti_coll_data(
uid=bytes.fromhex("A1B2C3D4"),
atqa=bytes.fromhex("0004"),
sak=bytes.fromhex("08"),
ats=b""
)
# 3. 전체 섹터 데이터 + 키 쓰기
for block in range(64):
chameleon.mf1_write_emu_block_data(block, block_data[block])
# 4. 에뮬레이션 활성화 → 리더에 카드처럼 인식됨
chameleon.set_slot_enable(0, TAG_SENSE_HF, True)
# ... 사용자가 문 앞에서 태그 → 인증 자동 처리 → 문 열림 ...
# 5. 보안을 위해 에뮬레이션 비활성화
chameleon.set_slot_enable(0, TAG_SENSE_HF, False)
7.6 주의사항
| 항목 | 설명 |
|---|---|
| 인증 중 데이터 변경 금지 | 리더 인증 진행 중 키/데이터 업데이트 시 세션 실패 가능 |
| 물리 배치 | ChameleonUltra가 리더 안테나 범위 내 (~5cm)에 고정 필요 |
| 동시 응답 충돌 | 에뮬레이션 ON 상태에서 물리 카드도 대면 충돌 발생 |
| BLE 범위 | ~10m 이내에서 앱 조작 후 리더에 접근 |
| 보안 | BLE 통신 구간 카드 데이터 암호화 필요 (키 노출 방지) |
7.7 요약
graph TB
Q{"ChameleonUltra를<br/>BLE 브릿지로 활용?"}
Q -->|BLE + Tag Emulation 동시| YES1["가능 ✅<br/>독립 페리퍼럴"]
Q -->|BLE로 카드 데이터 전송| YES2["가능 ✅<br/>RAM 즉시 반영"]
Q -->|Crypto1 인증 응답| YES3["가능 ✅<br/>완전 구현"]
Q -->|물리 카드 공존| YES4["가능 ✅<br/>ON/OFF 전환"]
Q -->|USB 상시 전원| YES5["가능 ✅<br/>슬립 방지"]
style YES1 fill:#c8e6c9,stroke:#2e7d32
style YES2 fill:#c8e6c9,stroke:#2e7d32
style YES3 fill:#c8e6c9,stroke:#2e7d32
style YES4 fill:#c8e6c9,stroke:#2e7d32
style YES5 fill:#c8e6c9,stroke:#2e7d32
기존 출입 리더를 교체하지 않고, ChameleonUltra를 BLE 수신 → MIFARE Classic 에뮬레이션 브릿지로 앞단에 배치하면, 기존 물리 카드와 모바일 앱 출입을 동시 지원할 수 있다.