2

Tweetnacl.jsを使用してキー ペアを生成しました。

const base58KeyPairGenerator = (seed: Uint8Array) => ({
    publicKey: keyToPublicIdentityKey(nacl.sign.keyPair.fromSeed(seed).publicKey),
    secretKey: seedToSecretIdentityKey(seed)
});

const keyToPublicIdentityKey = (key) => {
    return keyToIdentityKey(key, 'idpub');
};

const seedToSecretIdentityKey = (seed) => {
    return keyToIdentityKey(seed, 'idsec');
};

const keyToIdentityKey = (key, prefix) => {
    const keyBuffer = Buffer.from(key, 'hex');
    if (keyBuffer.length !== 32) {
        throw new Error('Key/seed must be 32 bytes long.');
    }
    const address = Buffer.concat([prefix, keyBuffer]);
    const checksum = sha256d(address).slice(0, 4);
    return base58.encode(Buffer.concat([address, checksum]));
};

const sha256d = (data) => {
    return Buffer.from(
        sha256()
            .update(
                sha256()
                    .update(data)
                    .digest()
            )
            .digest()
    );
};

const keyPair = base58KeyPairGenerator(nacl.randomBytes(32));

base58 キー ペア (base58 の公開キーと秘密キー) を取得したので、次のような秘密キーでメッセージに署名したいと思います。

nacl.sign(
          Buffer.from(someStringMessage, 'hex'),
          base58.decode(keyPair.secretKey)
        )

base58これはこのライブラリからのものです。

ただし、次のエラーが表示されます。

bad secret key size

      at Object.<anonymous>.nacl.sign (node_modules/tweetnacl/nacl-fast.js:2257:11)

実際、このnacl.sign関数は 64 ビットの秘密鍵を想定していますが、私の base58 バージョンには当てはまりません。

base58 を保持したまま修正する方法はありますか、または によって生成された元の Ed25519 形式nacl.randomBytes(32)、つまり変換されていないものを使用する必要がありますか?

4

1 に答える 1

4

そうは言っても、NaCl 署名キーは 32 バイトではなく 64 バイトです。したがって、エラーが発生します。

base58KeyPairGenerator関数では、秘密鍵はシードだけでなく、(またはそれが呼び出されたもの) の出力である必要がありますnacl.sign.keyPair.fromSeed(seed).secretKey.privateKey

于 2019-09-20T07:31:10.470 に答える