
Как резервируется приватный ключ в Tangem Wallet


Чтобы не потерять доступ к криптовалюте в случае, если вы утратите ваш криптокошелек, приватный ключ надо забэкапить (сделать резервные копии). Обычно эту задачу решают с помощью seed-фразы. Но это крайне небезопасно — seed-фразой может воспользоваться любой человек, которому она попадет в руки.
Поэтому в Tangem Wallet предусмотрена технология защищенного клонирования приватного ключа. Вы можете склонировать ваш приватный ключ на вторую и третью карту Tangem и не беспокоиться об утере или краже одной из карт.
Но безопасен ли такой способ бэкапа? Давайте разберемся, как это работает в Tangem Wallet.
Создание приватного ключа
Изначально, до активации, в кошельке Tangem приватного ключа (KPRIV на схеме) нет. Покупатель получает неактивированный Tangem Wallet, в котором еще не появился приватный ключ, и поэтому может быть уверен, что никаких «неучтенных» экземпляров ключа в природе нет. Невозможно скопировать то, чего еще не существует.
В процессе активации кошелька чип Tangem создает новый приватный ключ на основе числовой последовательности, полученной от сертифицированного аппаратного генератора случайных чисел (TRNG на схеме). Как это происходит, мы уже писали в статье «Как создается приватный ключ в кошельках с seed-фразой и без нее».
На этом этапе существует только один экземпляр приватного ключа. Но нужно еще создать несколько копий — то есть сделать бэкап. И сделать его следует безопасно.
Подготовка к бэкапу
В процессе бэкапа надо передать приватный ключ на другие карты так, чтобы его нельзя было украсть и чтобы пользователь полностью контролировал количество существующих копий своего приватного ключа.
Поэтому резервирование приватного ключа содержит две подзадачи:
- нужна абсолютная уверенность в том, что ключ будет передаваться именно на другую карту Tangem;
- следует защитить ключ от перехвата в процессе передачи, для этого его надо зашифровать так, чтобы расшифровать могла только карта-приемник.
Когда карту изготавливают на фабрике, чип генерирует собственную ключевую пару из закрытого ключа Kcardpriv и открытого ключа Kcardpub. Эти ключи уникальны для каждой карты. Они никак не связаны с кошельком будущего пользователя карты и нужны только для того, чтобы карта могла доказать свою аутентичность — то есть, что ее выпустил именно Tangem.
Открытый ключ из этой пары Tangem подписывает закрытым ключом производителя KTangempriv. Получившийся сертификат Cert_Card в дальнейшем используется для валидации карты.
Также в чип записывается открытый ключ производителя KTangempub. Этот ключ один для всех карт, начиная с него, каждая карта выстраивает «цепочку доверия» от себя до другой карты.
Задача первая: взаимная аутентификация
Чтобы каждая карта во время процедуры бэкапа была «уверена» в том, что на той стороне находится настоящая карта Tangem, между ними нужно выстроить криптографическую «цепочку доверия» из ключей и подписей к ним.
Во время активации каждая карта создает одноразовую ключевую пару для связи — Klinkpub и Klinkpriv — и открытый ключ из этой пары подписывает своим закрытым ключом Kcardpriv, получая в результате подпись Sign_Attest.
После этого карта отправляет другой карте Sign_Attest, Klinkpub и Kcardpub.
В итоге выстраивается такая цепочка доверия: KTangempub — Kcardpub — Klinkpub. Открытый ключ производителя KTangempub известен каждой карте. Им карта проверяет сертификат Сеrt_Card другой карты, и если он соответствует Kcardpub другой карты, то этим Kcardpub она проверяет подпись Sign_Attest другой карты. Если Sign_Attest соответствует Klinkpub другой карты, значит на той стороне канала находится настоящая карты Tangem, ее ключ Klinkpub никто не подменил, и его можно использовать для вычисления общего ключа бэкапа Ktrans.
Задача вторая: получение общего ключа шифрования
На этом этапе обеим картам нужно сгенерировать общий симметричный ключ Ktrans, которым карта-источник будет шифровать приватный ключ пользователя, а карта-приемник — расшифровывать. Так как канал связи между ними обеспечивает недоверенное устройство, то просто сгенерировать ключ в одной карте и передать его другой нельзя. Поэтому для решения этой задачи используется протокол Диффи-Хеллмана.
Напомним, карты только что обменялись ключами Klinkpub, которые проверили и которым доверяют. Каждая карта из своего Klinkpriv и Klinkpub другой карты генерирует симметричный ключ шифрования Ktrans, и у обеих карт он оказывается одинаковым! Так работает магия протокола Диффи-Хеллмана.
Причем если некий злоумышленник перехватит контроль над телефоном и сможет «подслушать» обмен карт, он узнает всего-то открытые ключи Klinkpub и Kcardpub, так как карты передают только их. Закрытые ключи Klinkpriv ему не получить — а значит, сгенерировать такой же Ktrans у него не получится.
Шифрованная передача ключа
Получившимся симметричным ключом Ktrans первая карта шифрует набор данных, в который входит приватный ключ пользователя, заданный пользователем код доступа и количество бэкапов приватного ключа (2 либо 3). Полученную зашифрованную посылку ENC карта передает второй карте, которая расшифровывает ENC тем же Ktrans. Если в этот момент кто-либо сумеет перехватить ENC, это ничего ему не даст — Ktrans он не знает и расшифровать посылку не сможет.
При выполнении бэкапа на третью карту вся процедура точно такая же — но при этом карты генерируют новые пары Klink, и поэтому Ktrans тоже получается другой, нежели при бэкапе на вторую карту.
В прошивку чипа Tangem заложено выполнение одного бэкапа. То есть отдав либо получив приватный ключ, карта больше не будет участвовать в процедуре бэкапа. Приватный ключ становится неизвлекаемым.
Конечно же, если вы выполните сброс кошелька Tangem на заводские настройки, чип забудет Kpriv, и кошелек можно будет заново активировать, создать новый ключ и выполнить бэкап. Но прежний ключ после сброса настроек будет уничтожен.