Mini private key format

提供: tezos-wiki
Minikeyから転送)
移動先: 案内検索

[[QR-privkeys-sidebyside.png | thumb | right |ミニプライベートキー形式(左)とウォレットのインポート形式でエンコードされた同じ秘密キーのQRコードの比較(右)。両方のコードのドット密度とエラー修正レベルは同じですが、ミニキーはフルコードサイズの57%です。]] thumb | right |物理的なビットコインの小さなスペースにミニキー テンプレート:サンプル ミニプライベートキーフォーマット 'は、小さなスペースに埋め込むためにBitcoin秘密鍵を30文字以内でエンコードする方法です。この形式でエンコードされた秘密鍵は「ミニキー」と呼ばれます。この秘密鍵形式はCasascius物理ビットコイン用に設計され、最初に使用され、QRコードでの使用にも適しています。 QRコードでエンコードされる文字数が少ないほど、低いドット密度を使用することができます。また、同じスペース内のエラー訂正に割り当てられるドットの数が増え、可読性と耐性が大幅に向上します。ミニプライベートキーフォーマットは、タイプミスに対する小さな保護マージンとして、独自のビルトインチェックコードを提供します。

Casasciusシリーズ1のホログラムは、30文字ではなく、22文字のミニキー形式を使用します。すべてが長さ以外は同じです。ミニキー償還を適切に実施するためには、サービスとクライアントは30文字の書式をサポートする必要がありますが、古いCasasciusコインの償還を可能にするために22文字の書式をオプションでサポートすることもできます。将来のアプリケーションに22文字のフォーマットを使用することは、セキュリティ上の理由から推奨されません。代わりに標準の30文字の形式を使用する必要があります。

このエンコーディングを使用するキーの例は、 'S6c56bnXQiBjk9m _SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_ qSYE7ykVQ7NzrRy' です。

使用法[編集]

物理的ビットコイン[編集]

{{multiple image | align = vertical | width = 300 | image1 = Miniprivkeys.jpg | image2 = Minipubkeys.jpg | footer =表側(上段)にミニキー、下段(下段)に対応するアドレス接頭部付きの[[Casascius物理ビットコイン| Casasciusコイン] }} ミニキーは物理的ビットコインに幅広く使用されています。サイズが小さいため、コイン内部の小さな面でも簡単に印刷して読むことができるからです。典型的には、小型の紙またはプラスチックディスクが金属コインまたはバーの裏にある不正開封防止のセキュリティホログラムの後ろに置かれ、セキュリティーホログラムが取り除かれた場合にのみ読み取ることができるように内部にミニキーが印刷される。

いくつかの物理的ビットコインには、このディスクの背面を見るためのセキュリティホログラムのウィンドウが含まれています。このウィンドウには、隠されたミニキーに対応するアドレスのプレフィックスが含まれています。

1Dバーコード[編集]

ミニプライベートキーは、1次元バーコードに収まるほど小さく、実用的なままです。最も普及している1次元バーコード記号の中で、「コード128」として知られているものは、好ましいデータ密度と大文字と小文字が混在した文字列をサポートしているため、ミニキーのエンコードに最適です。 "Code 128-B"と呼ばれる変種は、小文字を含む文字列の最短コードを生成します。

コード128-Bでエンコードされたサンプルのミニキーは、次のようになります。

Image:Private_minikey_in_1D_barcode.gif

2Dバーコード[編集]

ミニ秘密鍵は、QRコードでの使用に適しています。可読性を最大限に高めるために推奨される設定は、QRバージョン3、エラー訂正レベルQ(最も近い25%の可能性のあるコードワード回復)です。 29x29グリッドになります。ミニキーQRコードは、QRバージョン2、エラー修正レベルL(最小、7%の可能性のあるコードワードリカバリ)で25x25グリッドに収まることができます。

29x29グリッドのQRコードとしてエンコードされたサンプルのミニキーのサンプルは次のようになります:

Image:Private_minikey_in_2D_barcode.gif

インポート[編集]

ミニ秘密鍵は、以下のクライアント/サービスを通じてインポートできます。

アプリケーション[編集]

現在のメインライン( "Satoshi")クライアントは、現在、ミニキーのインポートには使用できません。

ウェブ[編集]

  • BlockChain.info
    • 秘密鍵はBlockchain.infoウォレットにインポートすることができ、ビットコインはインポート時にすぐに別のアドレスに送信され、確認を待つ必要はありません。輸入後も、実際に別の住所に費やされるまで、資金は秘密鍵に関連付けられたままです。
  • StrongCoin

デコード[編集]

秘密鍵のエンコーディングは、Bitcoinで使用されるbase58アルファベットの30文字の英数字で構成されています。最初の文字は常に大文字のSです。 ミニキーが有効かどうかを判断するには:

#ミニプライベートキー文字列の最後に疑問符を追加します。 #文字列全体のSHA256ハッシュを取る。ただし、結果の最初のバイトだけを見ていきます。 #最初のバイトが00の場合、文字列は整形式のミニキーです。最初のバイトが00でない場合、文字列はミニキーとして拒否される必要があります。

SHA256の例[編集]

次に、サンプル秘密鍵 S6c56bnXQiBjk9mq _SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_ SYE7ykVQ7NzrRy </ tt>の例を示します。

"<tt> S6c56bnXQiBjk9 _SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_ mqSYE7ykVQ7NzrRy?</ tt>"という文字列は、00で始まるSHA256値を持ち、整形式です。

完全な256ビット秘密鍵を取得するには、文字列全体のSHA256ハッシュを取るだけです。キーが印刷のために複数の行に分割されていても、文字列の改行のエンコーディングはありません。 SHA256は正確に30バイトでなければなりません。

SHA256( "S6c56bnXQiBjk9 テンプレート:タグガントプライベートキー mqSYE7ykVQ7NzrRy")= 4C7A9640C72DC2099F23715D0C8A0D8A35F8906E3CAB61DD3F78B67BF887C9AB

このwallet import formatのサンプルキーは、<tt> 5JPy8Zg7z4P7RSLsiqcqyeAF1 _SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_ 935zjNUdMxcDeVrtU1oarrgnB7 </ tt>であり、対応する[Bitcoinアドレス]は<tt> 1CciesT23BNionJe _SAMPLE_ADDRESS_DO_NOT_SEND_ Xrbxmjc7ywfiyM4oLW </ tt>

コマンドラインの検証[編集]

OSXまたはLinuxデバイス上のコマンドラインからSHA256を計算するには:

echo -n "S6c56bnXQiBjk9 _SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_ mqSYE7ykVQ7NzrRy?" |シャム -  256

それは "<tt> 000f2453798ad4f951eecced2242eaef3e1cbc8a7c813c203ac7ffe57060355d - </ tt>"のようなテキスト行を出力するはずです。最初の2文字が<tt> 00 </ tt>なので、ミニキー<tt> S6c56bnXQiBjk9 _SAMPLE_PRIVATE_KEY_DO_NOT_IMPORT_ mqSYE7ykVQ7NzrRy </ tt>

チェックコード[編集]

ミニプライベートキー形式は単純なタイプチェックコードを提供します。ミニ・プライベート・キーは、形式のルールに準拠したキーだけを保持した「ブルートフォース」方式で生成する必要があります。鍵が整形式(Sから始まる30Base58文字)で、ハッシュチェックに失敗した場合は、おそらくタイプミスが含まれています。

文字列のSHA256ハッシュの後に '?' 0x00で始まる何も結果にならない場合、文字列は有効なミニプライベートキーではありません。

ミニ秘密鍵の作成[編集]

ミニ秘密鍵の作成は比較的簡単です。そのような鍵を作ることができるプログラムは、Casascius Bitcoin Utilityです。

ミニ・プライベート・キーからフル・サイズのプライベート・キーへの変換は片方向であるため、ミニ・プライベート・キーは「ゼロから」作成する必要があります。つまり、既存のフルサイズの秘密鍵をミニ秘密鍵に変換する方法はありません。

ミニ・プライベート・キーを作成するには、整形式の要件を満たすランダムな文字列を作成し、タイプチェックをパスしないものを削除するだけです。 (これは、候補の99%以上を排除することを意味します)。次に、適切なアルゴリズムを使用して、対応する秘密鍵を計算し、一致するBitcoinアドレスを計算します。 Bitcoinアドレスは、常に秘密鍵から計算できます。

ユーザーが小文字の「l」を間違えたような方法で印刷されていない限り、ミニキーに数字「1」を使用することを避けることを強くお勧めします。文字「l」を含むエントリが実際には数字「1」であるべきであることをユーザに伝えるためのクライアントおよび償還ツールはほとんど用意されておらず、単にコードを拒否し、ユーザに混乱を招く可能性があります。

すべての場合において、安全な暗号乱数ジェネレータを使用して、ランダムな文字列の予測可能性のリスクを排除する必要があります。

Pythonコード[編集]

次のコードは、Pythonでサンプル30文字のSHA256ベースのミニプライベートキーを生成します。実世界での使用のためには、ランダムなエントロピーのソースに置き換えなければなりません。Pythonのドキュメンテーションの "random"は、関数が暗号目的にはまったく適していないと述べています。 <source lang = "python"> ランダムにインポートする import hashlib

BASE58 = '23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'

def候補():

   ""
   ランダムで整形式のミニ・プライベート・キーを生成します。
   ""
   リターン( '%s%s'%( 'S'、  .join(
       [BASE58 [random.randrange(0、len(BASE58))] for i in range(29)])))

def GenerateKeys(numKeys = 10):

   ""
   ミニ・プライベート・キーを生成し、ミニ・キーとフル・キーを出力します
   秘密鍵。 numKeys is生成するキーの数。
   ""
   keysGenerated = 0
   totalCandidates = 0
   keysGenerated <numKeys:
       試してください:
           cand =候補()
           #タイプミスチェック
           t = '%s?' %cand
           #SHA256を一回り
           candHash = hashlib.sha256(t).digest()
           #ハッシュの最初の8ビットが0かどうかをチェックする
           if candHash [0] == '\ x00':
               privateKey = GetPrivateKey(cand)
               '%s \ nsha256(?):%s'%s '
                     (cand、privateKey、candHash.encode( 'hex_codec')))
               If CheckShortKey(cand):
                   print( 'Validated。')
               else:
                   print( '無効!')
               keysGenerated + = 1
           totalCandidates + = 1
       KeyboardInterruptを除く:
           ブレーク
   print( '\ n%s:%i \ n%s:%i \ n%s:%.1f'%
         (「キー生成」、keysGenerated、
          「総候補者」、totalCandidates、
          「パーセンテージを拒否する」、
          100 *(1.0-keysGenerated / float(totalCandidates)))))

def GetPrivateKey(shortKey):

   ""
   対応する秘密鍵の16進表現を返します。
   指定された短いキーに割り当てます。
   ""
   If CheckShortKey(shortKey):
       戻り値hashlib.sha256(shortKey).hexdigest()
   else:
       print( '私有鍵でタイプミスが検出されました!')
       返品なし

def CheckShortKey(shortKey):

   ""
   ショートキーのタイプミスをチェックします。
   ""
   もしlen(shortKey)!= 30ならば:
       Falseを返す
   t = '%s?' %shortKey
   tHash = hashlib.sha256(t).digest()
   #最初のバイトが\ x00であることを確認します
   if tHash [0] == '\ x00':
       Trueを返す
   Falseを返す

</ source>