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 암호화 키를 생성해요. 이처럼 두 카드 모두 같은 Ktrans 키를 얻게 돼요. 이것이 Diffie–Hellman 프로토콜의 원리예요.
만약 공격자가 사용자의 휴대폰을 장악해 카드 교환을 '도청'하더라도, Klinkpub와 Kcardpub 공개 키만 알 수 있어요. 이 키들만 카드 간에 전송되고, Klinkpriv 키는 외부에 노출되지 않으니, 공격자는 동일한 Ktrans를 생성할 수 없어요.

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

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