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)
、つまり変換されていないものを使用する必要がありますか?