Купить Tangem

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

Author logo
Tangem
Post image

Чтобы не потерять доступ к криптовалюте в случае, если вы утратите ваш криптокошелек, приватный ключ надо забэкапить (сделать резервные копии). Обычно эту задачу решают с помощью 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, и кошелек можно будет заново активировать, создать новый ключ и выполнить бэкап. Но прежний ключ после сброса настроек будет уничтожен.

Author logo
Авторы Tangem