ウォレットを紛失しても暗号資産へのアクセスを失わないようにするには、コピーを作成して秘密鍵をバックアップする必要があります。これは通常、シード・フレーズを使うことで行われます。しかしここで問題なのは、シード・フレーズの安全性が極めて低いということです。なぜなら、それを手にしたら誰でも使うことができるからです。
これが、Tangemウォレットが安全な秘密鍵のクローン作成ソリューションを提供する理由です。 1枚または2枚のバックアップ用のTangemカードに、秘密鍵のクローンを作成できます。そのうちの1枚が紛失したり盗まれたとしても、心配はありません。
しかし、このバックアップ方法はどれほど安全なのでしょうか?Tangemウォレットがどのようにしているのか見てみましょう。
秘密鍵の生成
まず始めに、アクティベートする前のTangemウォレットには秘密鍵(画像のKpriv)は存在しません。Tangemウォレットを購入すると、まだアクティベートされておらず秘密鍵のないパッケージが届きます。つまり、世界中のどこにも秘密鍵が存在しないということです。結局のところ、存在しないもののコピーを作成することはできません。
ウォレットのアクティベート処理中に、Tangemチップは認定ハードウェア乱数ジェネレータ(画像のTRNG)から受信した数値シーケンスに基づいて、新しい秘密鍵を生成します。このプロセスの仕組みについては、「シードフレーズあり・なしで暗号資産ウォレットの秘密鍵を作成する方法」の記事をお読みください。
この段階では、存在する秘密鍵は1つだけです。その後、バックアップとして1つまたは2つのコピーを作成する必要がありますが、これは安全に行わなければなりません。
バックアップ作成の準備
バックアップ処理中、秘密鍵は盗難されることがない方法で、他のカードに転送される必要があります。ユーザーは、秘密鍵のコピーの数を完全に制御することができます。
このため、秘密鍵のバックアップ処理は以下2つのサブタスクで構成されています:
- まず、鍵が別のTangemカードに転送されることを確実に確認する必要があります。
- 鍵は他のカードに転送する際に傍受されないように、保護する必要があります。つまり、受信側のカードだけが復号化できるように暗号化する必要があります。
カードが工場で製造されると、チップは独自の鍵ペア (Kcardpriv秘密鍵とKcardpub公開鍵) を生成します。これらの鍵は各カードに固有のものであり、将来のカードユーザーのウォレットにはまったく関連付けられていません。カードが真正性を証明し、Tangemによって製造されたことをアプリに伝えるためにのみ、鍵は必要となっています。
このペアの公開鍵は、製造元の秘密鍵(KTangempriv)を使用しTangemによって署名されます。その結果得られる証明書(Cert_Card)は、カードの検証に使用されます。
製造元の公開鍵(KTangempub)も、チップに書き込まれます。この鍵はすべてのカードで同じであり、送信元カードと送信先カード間の「信頼のチェーン」の起点となります。
1番目の課題: 相互認証
バックアップ処理中に、各カードが相手側のカードが本物のTangemウォレットのカードであることを「確信」するには、カードの鍵と署名から暗号化された「信頼のチェーン」を構築する必要があります。
アクティベーション中に、各カードは他のカードと通信するための使い捨ての鍵ペア (KlinkpubおよびKlinkpriv) を作成します。そして、このペアの公開鍵を秘密鍵(Kcardpriv)で署名して、Sign_Attest署名を作成します。
次に、カードはSign_Attest、Klinkpub、およびKcardpubの情報を他のカードに送信します。
このプロセスにより、次の信頼チェーンが作成されます: KTangempub — Kcardpub — Klinkpub。製造元の公開鍵KTangempubはすべてのカードに知られており、各カードはそれを使用してCert_Card証明書を検証します。これが他のカードのKcardpubと一致する場合、この鍵を使用してそのカードのSign_Attest署名を検証します。Sign_Attestが他のカードの Klinkpubと一致する場合、通信チャネルの反対側にあるカードはTangemによって実際に製造され、そのKlinkpub鍵は誰にも変更されておらず、共有Ktransバックアップ鍵の計算に使用できることを意味します。
2番目の課題: 共有暗号化鍵の取得
この段階では、両方のカードが共通の対称鍵(Ktrans)を生成する必要があります。ソースカードはこれを使用してユーザーの秘密鍵を暗号化し、宛先カードはこれを復号化します。両者間の通信チャネルは信頼できないデバイスによって提供されるため、片方のカードで鍵を生成して別のカードに転送することは不可能です。この問題は、ディフィー・ヘルマン鍵共有法を使用することで解決されます。
カードは、検証され信頼されたKlinkpub鍵を交換します。各カードは自身のKlinkprivと他のカードのKlinkpubを使用して対称Ktrans暗号化鍵を生成し、両方のカードで同じものになります。これがディフィー・ヘルマンの魔法のような働きです。
さらに、攻撃者がユーザーの電話を制御し、カード交換を「盗聴」できたとしても、カードによって送信されるのはKlinkpubとKcardpubの公開鍵だけなので、攻撃者はこの2つの鍵しか見つけることができません。Klinkpriv鍵はアクセスできないままなので、攻撃者は同じ Ktransを生成することはできません。
暗号化された鍵の交換
最初のカードは、取得したKtrans対称鍵を使用して、ユーザーの秘密鍵とアクセスコード、秘密鍵のバックアップの数(2枚または3枚のカードのセット)を含むデータセットを暗号化します。カードは、暗号化されたENCメッセージを2枚目のカードに送信し、2枚目のカードは同じKtransを使用してそれを復号化します。この時点で誰かがENCを傍受できたとしても、Ktrans鍵がなければパッケージを復号化できないため、何も見つけることはできません。
3枚目のカードのバックアップを行う場合も、手順はまったく同じです。しかし、カードは新しいKlinkペアを生成するため、Ktrans鍵は2枚目のカードにバックアップするときに使用する鍵とは異なります。
Tangemチップのファームウェアでは、1回のバックアップのみを完了できます。秘密鍵の送信または受信後、カードはバックアップ処理を開始しなくなり、秘密鍵は回復できなくなります。
Tangemウォレットを工場出荷時の状態にリセットすると、チップはKpriv鍵を忘れ、ウォレットを再アクティブ化し、新しい鍵を生成して、新しいバックアップを完了することができます。ただし、リセット後に古い鍵は破棄されることに注意してください。