Tangem Wallet의 프라이빗 키 백업 방식
암호화폐 지갑을 분실해도 자산 접근 권한을 잃지 않으려면 프라이빗 키를 복사해 백업해 두는 것이 중요해요. 일반적으로 시드 구문(시드 문구)을 사용해 백업하지만, 누구든 시드 구문을 손에 넣으면 자산을 가져갈 수 있기 때문에 매우 위험해요.
이 때문에 Tangem Wallet은 안전한 프라이빗 키 복제(클로닝) 방식을 제공해요. 프라이빗 키를 한 장 또는 두 장의 백업 Tangem Card로 복제할 수 있어, 카드 중 하나를 잃어버리거나 도난당해도 걱정하지 않아도 돼요.
그렇다면 이 백업 방식은 얼마나 안전할까요? Tangem Wallet이 어떻게 이를 구현하는지 살펴볼게요.
프라이빗 키 생성 과정
활성화 전에는 Tangem Wallet에 프라이빗 키(Kpriv, 다이어그램 참고)가 존재하지 않아요. Tangem Wallet을 구매하면 아직 활성화되지 않은 패키지를 받게 되고, 이때는 프라이빗 키도 없기 때문에 전 세계 어디에도 복사본이 존재하지 않는다는 점을 확실히 알 수 있어요. 존재하지 않는 것은 복사할 수 없으니까요.
지갑을 활성화할 때 Tangem 칩이 인증된 하드웨어 난수 생성기(TRNG)가 만든 숫자 시퀀스를 바탕으로 새로운 프라이빗 키를 생성해요(다이어그램 참고). 이 과정이 궁금하다면 아래 글을 참고해 주세요. 시드 구문이 있을 때와 없을 때 암호화폐 지갑의 프라이빗 키 생성 방법.
이 단계에서는 프라이빗 키가 단 하나만 존재해요. 이후 안전하게 백업을 위해 한두 개의 복사본을 만들어야 해요.
백업 준비 과정
백업 과정에서는 프라이빗 키가 다른 카드로 안전하게 전달되어야 하며, 사용자는 프라이빗 키 복사본의 개수를 완전히 통제할 수 있어야 해요.
이 때문에 프라이빗 키 백업 과정은 두 가지 단계로 나뉘어요:
- 먼저, 키가 다른 Tangem Card로 제대로 전달됐는지 확인해야 해요.
- 전송 중에는 키가 가로채기 당하지 않도록 보호되어야 하며, 이를 위해 키는 암호화되어 오직 수신 카드만 복호화할 수 있어야 해요.
카드가 제조될 때 칩은 자체 키 쌍을 생성해요: Kcardpriv (프라이빗 키)와 Kcardpub (퍼블릭 키). 이 키들은 각 카드마다 고유하며, 향후 지갑 사용자의 지갑과는 연결되어 있지 않아요. 이 키들은 Tangem에서 제조된 정품 카드임을 증명하고 앱에 알려주기 위해 필요해요.
이 키 쌍의 퍼블릭 키는 Tangem이 제조사 프라이빗 키 KTangempriv로 서명해요. 이렇게 생성된 Cert_Card 인증서는 카드의 진위를 검증하는 데 사용돼요.
제조사 퍼블릭 키 KTangempub도 칩에 기록돼요. 이 키는 모든 카드에서 동일하며, 소스 카드와 목적지 카드 간의 '신뢰 체인'의 출발점이 돼요.

첫 번째 단계: 상호 인증
백업 과정에서 각 카드는 상대 카드가 진짜 Tangem Wallet 카드임을 확인해야 해요. 이를 위해 카드의 키와 서명을 바탕으로 암호학적 '신뢰 체인'을 구축해요.
활성화 시 각 카드는 다른 카드와 통신하기 위해 일회용 키 쌍 Klinkpub과 Klinkpriv를 생성하고, 이 쌍의 퍼블릭 키를 자신의 Kcardpriv로 서명해 Sign_Attest 서명을 만들어요.

이후 카드는 Sign_Attest, Klinkpub, Kcardpub 정보를 상대 카드로 전송해요.
이 과정에서 KTangempub — Kcardpub — Klinkpub 순서의 신뢰 체인이 만들어져요. 모든 카드는 제조사 퍼블릭 키 KTangempub,를 알고 있으며, 이를 통해 Cert_Card 인증서를 검증해요. 인증서가 상대 카드의 Kcardpub과 일치하면, 해당 키로 그 카드의 Sign_Attest 서명을 검증할 수 있어요.
Sign_Attest가 상대 카드의 Klinkpub과 일치하면, 통신 채널 반대편 카드가 실제 Tangem에서 생산된 것이며 누구도Klinkpub 키를 변경하지 않았다는 의미예요. 이 키는 공유 Ktrans 백업 키를 계산하는 데 사용돼요.

두 번째 단계: 공유 암호화 키 생성
이제 두 카드는 소스 카드가 사용자의 프라이빗 키를 암호화하고, 목적지 카드는 이를 복호화할 수 있도록 공유 대칭 키 Ktrans를 생성해야 해요. 카드 간 통신은 신뢰할 수 없는 기기를 통해 이뤄지기 때문에, 한 카드에서 키를 만들어 다른 카드로 단순히 전송하는 것은 불가능해요. 이 문제는 Diffie–Hellman 키 교환 프로토콜로 해결돼요.
카드들은 방금 검증된 Klinkpub 키를 교환했고, 각 카드는 자신의 Klinkpriv와 상대 카드의 Klinkpub을 이용해 동일한 대칭 Ktrans 암호화 키를 생성해요. 이로써 두 카드 모두 같은 키를 얻게 돼요. 이것이 바로 Diffie–Hellman 방식의 핵심이에요.
만약 공격자가 사용자의 휴대폰을 장악해 카드 간 교환을 '도청'하더라도, Klinkpub와 Kcardpub 퍼블릭 키 정보만 알 수 있어요. 이 정보만으로는 Ktrans를 생성할 수 없으므로, 공격자는 프라이빗 키에 접근할 수 없어요.

암호화된 키 교환
얻어진 Ktrans 대칭 키를 사용해, 첫 번째 카드는 사용자의 프라이빗 키와 접근 코드, 프라이빗 키 백업 개수(2장 또는 3장)를 포함한 데이터 세트를 암호화해요.
카드는 암호화된 ENC 메시지를 두 번째 카드로 전송하고, 두 번째 카드는 동일한 Ktrans로 이를 복호화해요. 이때 누군가 ENC 메시지를 가로채더라도, Ktrans 키 없이는 패키지를 해독할 수 없으니 정보를 알 수 없어요.

세 번째 카드 백업도 동일한 절차로 진행되지만, 이때는 카드가 새로운 Klink 쌍을 생성하므로 Ktrans 키도 두 번째 카드 때와 달라져요.
Tangem 칩 펌웨어는 한 번의 백업만 허용해요. 프라이빗 키를 주거나 받은 뒤에는 카드가 더 이상 백업 절차를 시작하지 않으며, 프라이빗 키는 복구할 수 없게 돼요.
Tangem Wallet에서 공장 초기화를 실행하면 칩이 Kpriv 키를 잊어버려요. 이후 지갑을 다시 활성화해 새로운 키를 생성하고 새 백업을 완료할 수 있지만, 이전 키는 초기화 후 완전히 삭제돼요.