鍵ってなんだかんだよく使いますよね。テスト書くときとか。
CKey
定義ファイル: src/key.h, src/key.cpp
概要
公開鍵をカプセル化したクラス。もちろん Bitcoin で使われている secp256k1 にそった仕様の秘密鍵です。
使い方
code: cpp
// ランダムな鍵の生成
CKey key;
key.MakeNewKey(true);
// 鍵のインポート
std::vector<unsigned char> parsedKey = ParseHex("79f2cbfb6e03ddb51d211d36daf08b524cd7252cb2c654d8de68efe3fbac33b0");
CKey key2;
//第3引数はこの秘密鍵から生成するpubkeyを圧縮するかどうか。trueだとcompressed pubkeyを生成する
key2.Set(parsedKey.begin(), parsedKey.end(), true);
CPubKey
ファイル: src/pubkey.h, src/pubkey.cpp
概要
公開鍵をカプセル化したクラス。
使い方
code:cpp
// 秘密鍵から公開鍵を生成
CKey key;
key.MakeNewKey(true); // ← 秘密鍵を生成
CPubKey pubkey = key.GetPubKey();
// 16進数表現の文字列からインポートする
std::string pubkeyString = "04F038892BAD7ED57D2F...省略...";
std::vector<unsigned char> vch = ParseHex(pubkeyString);
CPubKey pubkey(vch.begin(), vch.end());
// CPubKey から16進数表現の文字列を取得する
std::string pubkeyString = HexStr(pubkey.begin(), pubkey.end());
std::cout << pubkeyString << std::endl;
HexStr, ParseHex を使うと、std::vector<unsigned char> と 16進数表現の文字列を相互に変換可能で便利です。
CPrivKey
DER形式で表現された秘密鍵
以下、抜粋。
code: ANS.1 private key format
ECPrivateKey ::= SEQUENCE {
version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey OCTET STRING,
parameters 0 ECDomainParameters {{ SECGCurveNames }} OPTIONAL, publicKey 1 BIT STRING OPTIONAL }
ECDomainParameters{ECDOMAIN:IOSet} ::= CHOICE {
specified SpecifiedECDomain,
named ECDOMAIN.&id({IOSet}),
implicitCA NULL
}
SpecifiedECDomain ::= SEQUENCE {
version SpecifiedECDomainVersion(ecdpVer1 | ecdpVer2 | ecdpVer3, ...),
fieldID FieldID {{FieldTypes}},
curve Curve,
base ECPoint,
order INTEGER,
cofactor INTEGER OPTIONAL,
hash HashAlgorithm OPTIONAL,
...
}
Tips1 公開鍵のバリデーション
CPubKey::IsFullyValid() を使う。(バリデーション処理の中身については未確認)
code:cpp
CKey key;
key.MakeNewKey(true);
CPubKey pubkey = key.GetPubKey();
BOOST_CHECK(pubkey.IsFullyValid()); // ← バリデート
Tips2: 生のprivate keyの抽出とHexStringへの変換
code: export private key
// 32byteの秘密鍵を抽出
CKey key;
key.MakeNewKey(true); // ← 秘密鍵を生成
std::vector<usigned char> secret(key.begin(), key.end()); // ← 秘密鍵の抽出
std::string privHex = HexStr(key.begin(), key.end()); // ← 秘密鍵のHex文字列取得
key.getPrivKey()すると、der形式の秘密鍵が返されるので、32byteの生の秘密鍵が欲しい場合は↑の方法で取得する。