취미/자동차 및 전자기기

NFC 카드 데이터 쓰기 — CUID에 대하여

lazykuna 2026. 7. 26. 15:24

최근에는 NFC 복제 관련으로 삽질을 하다가, 한 가지 중요한 사실을 알아내어, 이를 다루고자 한다.

먼저 글을 계속하기 전에 DISCLAIMER: 이 아티클은 NFC의 주된 인증 방법과 이와 관련된 규격에 대해 다룬 글이며, 사용에 따른 책임은 전적으로 본인에게 있습니다.

NFC의 종류

먼저 NFC를 가지고 놀기 전에 NFC에 대해서 조금 심층깊게 스펙을 알아볼 필요가 있다. NFC의 용도나 활용성에 대해서는 너무나 널리 알려져있기 때문에 여기서는 패스.

NFC 저장 용량에 따른 종류

태그 사용 가능 용량 적합한 용도

태그 사용 가능 용량 적합한 용도
NTAG213 144바이트 웹 주소나 간단한 텍스트 저장
NTAG215 504바이트 연락처 정보나 게임 피규어 데이터 저장
NTAG216 888바이트 긴 텍스트나 많은 양의 데이터 저장

이외에도 다양한 종류가 있다.

하지만, NFC에 다양한 정보를 넣을 것이 아닌 섹터0 (주로 사원증/인증 목적) 을 변조하는 것이 목적이라면, 어느 것을 사든 무방하다. 섹터0은 어떤 칩이든 모두 들고 있기 때문이다.

주파수

주파수는 여러가지가 있으나 보통 NFC의 경우 아래처럼 13.56Mhz 하나만 가용 주파수로 취급된다. (출처: 나무위키 NFC)

일반적으로도 모두 13.56Mhz 규격으로 팔기 때문에 크게 신경쓸 점은 아님.

  • RFID: 규격이 여러 가지다. 낮은 주파수 LF (125~134kHz), 높은 주파수 HF (13.56MHz), 매우 높은 주파수 UHF (856MHz ~960MHz)이다. 이 중 프록시미티 카드에서 사용하는 주파수는 13.56MHz이다.
  • NFC: 13.56MHz. 기존 RFID에서 높은 주파수 하나만 남겼다.

MIFARE

NFC 중에서 가장 흔하고 많이 쓰이는 규격은 바로 MIFARE이다. FeliCa나 다른 ISO 기술도 있긴 한데, FeliCa는 일본에서만 주로 쓰이는 규격이라 보면 된다.

종류 특징
MIFARE Classic 1K/4K 메모리, 가장 허접한 보안 (48Bit), S50 1K (칩셋 이름) 라고도 불림
MIFARE Plus 2K/4K 메모리, 강화된 보안 (128Bit)
MIFARE Ultralight 512비트 메모리, DES 암호화

(출처: 나무위키 MIFARE 문서)

여기서 우리가 다룰 규격은 MIFARE Classic 이다. 보안이 참을 수 없을 정도로 허접하기 때문에, 대부분의 리더기는 바로 암호화를 해제하고 데이터를 가져오며, 또한 내가 본 대부분의 NFC 카드(사원증/출입증)이 MIFARE Classic으로 출입증이 만들어져 있었다.

어떤 NFC를 구해야 하는가?

여기까지 봤다면, 데이터를 담을 NFC를 어떤 종류를 구매해야 하는지를 알 수 있다.

  • 단순 데이터 (URL, 와이파이 정보)를 담고 싶다: NTAG213~215
  • 큰 데이터 (이미지, 데이터 등): NTAG216 이상의 적절한 NFC
  • 사원증 데이터: MIFARE Classic with CUID (간혹 가다 클래식이 아닌 경우도 있을 수 있음. 사원증을 NFC 리더기로 따서 나오는 메타데이터를 보면 어떤 종류로 구해야 하는지 알 수 있다)

실제 판매중인 MIFARE Classic + S50 1K + CUID NFC RFID 칩셋

딱 위와 같은 칩셋의 경우, MIFARE Classic + 1K 데이터 + CUID 로서, 위에서 이야기하는 모든 사용례가 적절히 충족되는 “국밥 칩셋” 이라고 볼 수 있다.

참고로 UID/CUID에 대해서는 다음 문단에서 자세히 다룬다. 물론 작동 원리가 굳이 궁금하지 않고 주어진 유틸리티들로 사용만 하는 것이 목적이라면, 여기까지만 글을 읽어도 충분하다.

NFC의 데이터 구조와 UID

이제 본격적으로 NFC 데이터 구조를 까볼 차례다. 보안키를 뚫었다 한들, 여전히 NFC 내부에는 넘어가야 할 난관이 있기 때문에, 데이터 구조의 이해는 필수불가결이다.

먼저, NFC의 데이터를 읽어오면, 아래와 같이 데이터가 여러 섹터로 나뉘어져 있는 것을 볼 수 있다. 아래의 경우 S50 1K 데이터를 읽어온 것으로, 총 16개의 섹터를 볼 수 있다.

출처:  https://jasmine125.tistory.com/1015

여기서 0번 섹터의 0번 블록의 값을 NFC의 UID 영역이라고 일컫고, 마지막 블록에는 각 6바이트 크기의 비밀키 (Key A/B) 정보가 들어 있다.

그런데 카드의 특정 데이터를 읽거나 쓰려면 반드시 리더기/앱이 이 비밀키 값을 통해 인증(Authentication)을 통과해야 하는데, 해당 키값을 모를 경우 NFC의 읽기/쓰기를 모조리 할 수 없다.

그리고, 섹터 0에 해당하는 데이터는 보통 쓰기가 금지되어 있다. 이 때문에 비밀키는 일반적으로 복제가 불가능하다.

IF: 일반 NFC에 UID를 씌우면?

일전에 CUID NFC의 존재를 몰라서 아무 NFC 스티커나 사곤 했는데, 이상하게도 값을 읽는 건 되는데 쓸때는 Secret Key가 맞지 않는다면서 작동하지 않았다. 이것은 NFC writer의 특성에서 기인한다.

  • 먼저 특수 CUID 명령어를 시도
  • 반응이 없을 경우, Secret Key를 가지고 Sector 0(UID) 값 변경을 시도

하지만 앞서 말했듯, 일반적인 NFC 카드는 UID 영역의 변경이 금지되어 있다. 그래서 카드에서 거부 응답을 내뱉는 거고, 이것이 사용자 입장에서는 “잘못된 비밀키” 오류로 비춰지는 것이다.

물론 비밀키가 틀리진 않았다. 비밀키가 틀렸다면 아예 데이터를 읽어오지 못했을 것이니까.

Changeable UID

하지만 대륙 형님들은 이런 제약에서 멈추지 않는다. Changeable UID (CUID)라는 싱통방통한 개념을 들고 오는데, 말 그대로 UID가 변경 가능한 NFC 인 것이다. 이를 위해 NFC가 UID를 변경하기 위한 특수한 NFC 커맨드를 구현하고 있다. 그리고 NFC writer 또한 해당 명령어를 알아야 한다.

보통은 이를 위한 작업이 간단한 USB 장비와 프로그램으로 구현되고 있기 때문에 정말 쉽게 할 수 있다. 보통 컴퓨터로 작업시 ACR122 혹은 NC106 리더기를 사용하여 CUID에 쓰기를 할 수 있으며, 아니면 여타 다른 포터블 NFC 리더기도 어지간하면 문제없이 작동한다.

NC106 리더기

개인적으로는 컴퓨터에 연결해 쓰는 NFC 리더기를 추천하는데, 아래와 같이 훨씬 많은 정보(섹터 정보, NFC 카드 종류 등)를 볼 수 있고 조작 또한 가능하기 때문이다.

 

nfcPro 어플리케이션으로 NFC reader기를 통하여 NFC 칩셋 정보를 읽어온 사진

물론 섹터/블록 단위로 데이터를 다룰 필요가 없다면, 일반적인 안드로이드/아이폰 앱을 통하여 핸드폰의 NFC 리더기로도 데이터 읽기 쓰기가 가능하다. 다만 이 경우 섹터0 에 데이터를 쓸 수는 없으니 반드시 염두에 둘 것.

앱스토어에 올라와 있는 NFC Writer 앱

여기까지가 내가 시행착오를 겪으며 파악한 NFC 구조와 실전에서 데이터 쓰는 방법에 대한 이야기였다. 혹시라도 비슷한 삽질을 해볼 사람에게 도움이 되는 글이 되었으면 좋겠다.