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