HD財布プライベート、パブリック、アドレス生成プロセス

指定してください再現:https://www.cnblogs.com/tkblack/p/12625510.html

フロントニーモニック生成プロセスの理解、今全体のプロセスニーモニックアドレスを完了するのに最適な単語の下に。

実際には、長い時間のために、私は考えてニーモニックとシードは同じ概念であるが、それは(ニーモニック)ニーモニックと呼ばれる、そうではありません、シード(種子)と呼ばれます。

まずは不可逆的であり、種子がニーモニックを起動できないこのプロセスを起動するニーモニック種子、bip39使用PBKDF2により生成されます。

  この機能についての話にPBKDF2の必要性は、簡単に言えば、それは時代のhmac_sha512の多くを行う「ニーモニック+塩」であり、明らかに、このプロセスは不可逆的です。ここで塩は、ユーザが定義することができません一般的な財布の安全性を高めることであるが、開発者が固定されています。したがって、異なる財布インポート同じニーモニックは、それによって異なる秘密鍵を生成し、異なるシードを生成することができます。特定のは、少ない時間を計算hmac_sha512を行って?一度ウェブは、次のコードの分析に基づいて、2048ループのための2つの、第一層63、第二層2047回(最後のものが考慮されていないため)という。私の理解は、63 *(+ 1 2047)倍ということですので、私は、パラメータの値はITERが2048で渡されたので、2048年を言うと思います。

FUNCキー(パスワード、塩[]バイト、ITER、KEYLENのINT、時間FUNC()hash.Hash)[]バイト{//参数依次为:助记词、盐、2048,64、sha512.New 
    PRF: = HMAC .New(H、パスワード)
    hashLen: = prf.Size()
    numBlocks: =(KEYLEN + hashLen - 1)/ hashLenの

    VaRのBUF [ 4 ]バイト
    DK: =メイク([]バイト、0、numBlocks * hashLen)
    U: = メイク([]バイト、hashLen)
     のためのブロック:= 1; ブロック<= numBlocks。ブロック++ {
         // NB:|| 手段連結、^ 手段XOR
         // ため、各ブロックT_I = U_1 U_2 ^ ^ ... ^ U_iter
        // U_1 = PRF(パスワード、塩|| UINT(I))
        prf.Reset()
        prf.Write(塩)
        BUF [0] =バイト(ブロック>> 24 
        BUF [ 1] =バイト(ブロック>> 16 
        BUF [ 2] =バイト(ブロック>> 8 
        BUF [ 3] = バイト(ブロック)
        prf.Write(BUF [: 4 ])
        DK = prf.Sum(DK)
        T: = DK [lenは(DK) - hashLen:] 
        コピー(U、T)

         // U_n = PRF(パスワード、U_(N-1 ))
         のために、N = 2; N <= ITER。N ++ { 
            prf.Reset() 
            prf.Write(U)
            U = U [0] 
            U = prf.Sum(U)
             のために、X:= 範囲U { 
                T [X] ^ = U [X] 
            } 
        } 
    } 
    戻りDK [:KEYLEN] 
}

 

最初の32のバイトは、バイトコードとして、秘密鍵、チェーン32になるように64バイトのリターンを得るための2ステップと

  もちろん、我々は実際にプライベート組み立てられ、コード化された結果である参照してください。アセンブリ詳細:バージョン(0x80を)+ +元の秘密鍵圧縮フラグ(0x01の、圧縮されていない秘密鍵が充填されていない)+チェックコード(4バイト)、ここで、非圧縮の秘密鍵、秘密鍵71の圧縮ワードの70のバイトセクションの後、したがって、コーディングBASE58、51、又は52個の文字です。

 

実際には3、唯一の秘密鍵、公開鍵を生成して、アドレスを生成するために、私たちの財布が、それはアドレスの多くを生成することができます。これは、関連するとbip32で、パブリックまたはプライベート鍵bip32 + +鎖コードインデックス番号(32ビットを表すインデックス番号)のサブを生成する秘密鍵を使用することにより、サブ秘密鍵は、Sunのように秘密鍵を生成することができる、とすることができます秘密鍵の多くを生産します。図2は、秘密鍵32のサブ電源の秘密鍵を生成してもよい。0x80000000の公開鍵チェーンコード+ +サブインデックス生成した秘密鍵、より大きいを使用して、通常のタイプのインデックスよりも小さいか、秘密キーチェーンコード+ +を使用して拡張は0x80000000に等しいですサブインデックス番号は、秘密鍵を生成しました。

 

4.パブリックまたはプライベートコード+指数+鎖、hmac_sha512動作のため、64バイトの出力に到達するために、新しい32ビットのチェーンコードの後、新しい秘密鍵の最初の32ビット、。

 

秘密鍵公開鍵がsecp256k1曲線の導出を用いて、ECC生成アルゴリズムを用いて生成され、誘導された式:K = K * G(kは秘密鍵であり、Kは、公開鍵を表し、Gは基点を表します)。

  簡単なのではないここでは、ECC具体的な原理は、その加算や乗算再定義です。上記の式を仮定する、K = 3、K = G + G + G(可換、連想である); Pと直線Qを通過するアルゴリズムP + Q結果(Q = P、それは点Pを通っている場合別の接線との交点)と対称のX軸上secp256k1曲線点、Kは実際に曲線(それ自体がX軸に対して対称曲線)上の点であるので。

  公開鍵は、圧縮と非圧縮形式であるので、フロントと秘密鍵への非圧縮を述べました。我々はすでにKがポイントK(x、y)は、圧縮されていないプライベートであることを知っている:バージョンプレフィックス(0x04を)+ Kxの+ Kyの、明らかに、我々は唯一のKxのを使用して、Kxのケンタッキー(曲線が決定されているので)の導き出すことができます十分、圧縮秘密鍵:バージョンの接頭辞(0×02または0×03)+ Kxを。そうすることの目的は、スペースのあるブロックを保存することです。yの値が正であってもよいし、こうして02は、正の(偶数)、03は負(奇数)であるを示し、区別するために使用される2つのプレフィックスを定義する、負であってもよいので、02及び03は、二つの理由プレフィックスが必要。今、基本的には圧縮公開鍵を使用し、最終的にBASE58エンコーディングは、我々が通常見publicです。ここで、私は圧縮ケンタッキー州は、2つのプレフィックスを定義する必要がない場合は、公開を利用したいと思います。

 

6.パブリックアドレス生成、および使用SHA256 RIPEMD160アルゴリズム。

  まず、公開鍵SHA256動作、次に操作RIPEMD160、この値はR&LTであると仮定される記録。

  チェックコードを確認するために想定されるようにRのSHA256の操作を2回、結果は、最初の4つのバイトでした。

  ステッチング:、これは完全な公開鍵プレフィックス($ 00)+ R +チェックです、もちろん、我々は、公開鍵の最後とBASE58エンコードする一般的な形式を取得し、我々は、Rは、実際の公開鍵であることを知っているが、後に我々はいくつかの追加情報を持っています。

 

全体のプロセスは、このようなものです、何か間違っているか、場所の不正確な記述がある場合には、ビット混沌を書き、私を修正してください!

おすすめ

転載: www.cnblogs.com/tkblack/p/12625510.html