「ブロックチェーンの暗号化」:ハッシュ関数、キー、デジタル署名について

暗号化はブロックチェーンの中心であり、システムの動作を保証します。 ブロックチェーンアーキテクチャは、ネットワーク参加者間の信頼が数学と経済学の原則に基づいていること、つまり、形式化されていることを示唆しています。 また、暗号化は、業界標準の境界セキュリティ制限ではなく、すべての操作の透明性と検証可能性に基づいてセキュリティを保証します。



さまざまな暗号化技術により、ブロックチェーントランザクションログの不変性が保証され、認証の問題が解決され、ネットワークおよびブロックチェーン全体のデータへのアクセスが制御されます。 今日の記事では、ハッシュ関数、キー、デジタル署名について説明します。





/ image BTCキーチェーン CC



ハッシュ関数



ハッシュとは、任意の長さの入力データの配列を固定長の(出力)ビット文字列に変換するプロセスです。 たとえば、ハッシュ関数は、任意の数の文字(1文字または文学作品全体)を含む文字列を受け取り、厳密に定義された文字数(ダイジェスト)を含む文字列を出力できます。



ハッシュ関数は、ほぼすべてのプログラミング言語で使用できます。 たとえば、ハッシュテーブルとセット(JavaのHashMap / HashSet、Pythonのdictとset、JavaScriptのMap、Setとオブジェクトなど)の実装に使用されます。 ハッシュ関数の別のカテゴリーは暗号ハッシュ関数です。 これらは、ハッシュテーブルで一般的に使用される関数よりもはるかに厳しい要件の対象です。 したがって、 パスワードを保存するなど、より深刻な場合に使用されます 。 暗号化ハッシュ関数は、世界中の研究者によって開発され、徹底的にテストされています。



簡単なPythonプログラムを書くことで、ハッシュ関数を試すことができます:



import hashlib def hash_hex(message): return hashlib.sha256(message.encode()).hexdigest()
      
      





hash_hex()関数は、ストリングの16進表記でハッシュ表現を計算します。 上記の例では、SHA-256関数が使用されています-ビットコインと同じです。



優れたハッシュ関数は、衝突に対する保護を提供し(異なる初期データで2つの同一のハッシュを取得することは不可能です)、入力データのわずかな変化が出力値を大幅に変換する、いわゆる雪崩効果があります。 SHA-256ハッシュ関数のなだれ効果は次のとおりです。



 >>> hash_hex('Blockchain') '625da44e4eaf58d61cf048d168aa6f5e492dea166d8bb54ec06c30de07db57e1' >>> hash_hex('blockchain') 'ef7797e13d3a75526946a3bcf00daec9fc9c9c4d51ddc7cc5df888f74dd434d1' >>> hash_hex('Bl0ckchain') '511429398e2213603f4e5dd3fff1f989447c52162b0e0a28fe049288359220fc'
      
      





ブロックチェーンハッシュ関数は、トランザクションチェーン全体の不可逆性を保証します。 実際、新しいトランザクションブロックはそれぞれ、レジストリ内の前のブロックのハッシュを参照しています。 ブロック自体のハッシュは、ブロック内のすべてのトランザクションに依存しますが、ハッシュ関数を順番にトランザクションに渡すのではなく、ハッシュ付きのバイナリツリー(マークルツリー)を使用して1つのハッシュ値に収集されます。 したがって、ハッシュは、通常のデータ構造(リンクリストとバイナリツリー)のポインターの代わりとして使用されます。



ハッシュの使用により、ブロックチェーンの一般的な状態(これまでに実行されたすべてのトランザクションとそのシーケンス)は、1つの単一の番号で表現できます。最新のブロックのハッシュです。 したがって、1つのブロックのハッシュ不変性プロパティは、ブロックチェーン全体の不変性を保証します。









以下は、Pythonのビットコインで使用されるマークルツリーの再帰的な実装です( 参照により作業の例を見つけることができます )。 この関数には、トランザクションハッシュのリストがあります。 計算の各段階で、ハッシュ関数を使用して連続するハッシュのペアが結合されます。 ハッシュが奇数の場合、最後のハッシュが複製されます。 その結果、リスト全体の最終的なハッシュ値であるハッシュのみが残ります。



 import hashlib def merkle_root(lst): #        SHA-256   #  . ,    . sha256d = lambda x: hashlib.sha256(hashlib.sha256(x).digest()).digest() hash_pair = lambda x, y: sha256d(x[::-1] + y[::-1])[::-1] if len(lst) == 1: return lst[0] #         - # ,           . #         , #    : # https://github.com/bitcoin/bitcoin/blob/master/src/consensus/merkle.cpp#L9 if len(lst) % 2 == 1: lst.append(lst[-1]) return merkle_root([ hash_pair(x, y) for x, y in zip(*[iter(lst)] * 2) ])
      
      





ハッシュツリーには、ブロックチェーン以外にも多くの用途があります。 それらは、コピーの高速同期のためにデータベースによって配布されるファイルの整合性を検証するためにファイルシステムで使用され、証明書発行の信頼できるジャーナリングのためのキー管理で使用されます 。 Gitはハッシュツリーの一般化-ハッシュベースの有向非循環グラフを使用します。 ブロックチェーンでは、ブロックチェーンからのトランザクションのごく一部のみを処理する「ライトクライアント」の存在を可能にするため、ハッシュツリーの使用はパフォーマンスの考慮事項によって決まります。



デジタル署名



ブロックチェーンのデジタル署名は、公開キー暗号化に基づいています。 2つのキーを使用します。 最初の秘密鍵は、デジタル署名を生成するために必要であり、秘密にされています。 2つ目-公開鍵-は電子署名の検証に使用されます。 公開鍵は、実際には秘密鍵に基づいて計算できますが、逆変換には、ブルートフォースに匹敵する計算量を実際には不可能にする必要があります。









多くの異なる公開鍵暗号方式があります。 これらの中で最も人気のある2つは、因子分解スキーム (RSA)と楕円曲線スキームです。 後者は、キーと署名のサイズが小さいため、ブロックチェーンでより一般的です。 たとえば、ビットコインは、secd256k1楕円曲線とともにECDSA楕円暗号規格を使用ます。 その中で、秘密鍵の長さは32バイト、公開鍵の長さは33バイト、署名は約70バイトです。









公開鍵署名の一般的な考え方は次のとおりです。 アリスが1つのビットコインをボブに転送したいとします。 これを行うために、彼女はトランザクションを作成し、そこから取得する場所(アリスが他の人からビットコインを受け取った前のトランザクションの表示)と送信先(ボブの公開鍵)を書きます。 アリスはサードパーティのソースからボブの公開鍵を知っています-ボブはメッセンジャーを通じてアリスに送信したり、サイトで公開することさえできます。



次に、アリスは自分の秘密鍵を使用してトランザクションに署名します。 ビットコインネットワークのノードは、トランザクションが特定の公開キー(認証)で署名されていることを確認できます。この公開キーを使用すると、トランザクションの前に1つのビットコインがトランザクションに関連付けられます(承認) これらの条件が満たされると、翻訳されたビットコインはボブの公開鍵に関連付けられ始めます。



ブロックチェーンには任意のトランザクションを許可できる中央ノードがないため、システムのセキュリティは分散化され、ブロックチェーンへの介入が成功する確率はほぼゼロになります。



したがって、ブロックチェーンはデジタル署名を使用して、トランザクション(および場合によってはブロック)の認証と整合性を保証します。 暗号通貨の場合、認証プロセスとは、別の以前のトランザクションによって送信された相手だけがお金を使うことができることを意味します。 ブロックチェーンの特徴は、認証情報が各トランザクションに「縫い付けられる」ことであり、ビジネスロジックから分離されないため、ブロックチェーンはより安全であると考えられます。 通常のシステムでは、認証メカニズムをハッキングまたは管理的にバイパスしてバックエンドを操作できますが、ブロックチェーンではこれは定義上機能しません。






PS次の投稿では、スマートコントラクトやコンセンサスアルゴリズムなどの問題に触れ、ブロックチェーンでの量子コンピューターの普及が意味することについて話します。



PPSいくつかの追加ソース:








All Articles