暗号学系列-楕円曲線ECDSA-確定署名


署名におけるランダム性の重要性
署名生成アルゴリズムは、短い秘密鍵/公開鍵ペアの基礎として、ランダム鍵kを使用する.kの値はランダムである限り重要ではありません.同じ値kを用いて異なるメッセージ(トランザクション)上に2つの署名を生成すると、誰もが署名秘密鍵を計算することができる.署名アルゴリズムで同じk値を再利用すると、秘密鍵が露出します!
2つの異なる取引で署名アルゴリズムで同じ値kを使用する場合、秘密鍵は計算され、世界に露出することができる.
これは理論的な可能性だけではない.ビットコインにおけるいくつかの異なる実装の取引署名アルゴリズムが,この問題のためにプライベート鍵の暴露をもたらすことを見出した.人々は何気なくk値を繰り返し使用したため、資金が盗まれた.k値を再利用する最も一般的な理由は、乱数ジェネレータが正しく初期化されていないことです.
この脆弱性を回避するために、業界のベストプラクティスは、エントロピー播種の乱数生成器を用いてk値を生成するのではなく、取引データ自体を用いて播種する確定的なランダムプロセスである.これにより、取引ごとに異なるk値が生成されることが保証される.インターネットエンジニアリングタスクグループ(InternetEngineering Task Force)が発表したRFC 6979において、k値の決定的初期化のための業界標準アルゴリズムが定義されている.
ブロックチェーンで取引に署名するためのアルゴリズムを実装している場合は、RFC 6979または同様の を使用して、取引ごとに異なるk値が生成されることを保証する必要があります.
RFC 6979:確定ランダムアルゴリズム
決定的には,デジタル署名アルゴリズム(DSA)と楕円曲線デジタル署名アルゴリズム(ECDSA)を用いた.
この規格は、標準デジタル署名アルゴリズム(DSA)および楕円曲線デジタル署名アルゴリズム(ECDSA)デジタル署名と互換性のある決定的なデジタル署名生成プロセスを定義し、説明されたプロセスを理解する必要がなく、修正されていない検証プログラムを使用して処理することができる.決定的な署名は、デジタル署名に関連付けられたパスワードセキュリティ機能を保持しますが、高品質のランダムソースにアクセスする必要がないため、さまざまな環境でより簡単に実現できます.
  • 同じ取引に署名すると、同じk値
  • が生成される.
  • 異なる取引に署名すると、異なるk値
  • が生成される.
    // secp256k1                k   
    static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) {
       secp256k1_rfc6979_hmac_sha256_t rng;
       unsigned int i;
       secp256k1_rfc6979_hmac_sha256_initialize(&rng, key32, 32, msg32, 32, (const unsigned char*)data, data != NULL ? 32 : 0);
       for (i = 0; i <= counter; i++) {
           secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);
       }
       secp256k1_rfc6979_hmac_sha256_finalize(&rng);
       return 1;
    }
    

    参考:RFC 6979