Можно ли подписать сообщение секретным ключом base58 с помощью библиотеки Tweetnacl? - PullRequest
2 голосов
/ 20 сентября 2019

Я сгенерировал пару ключей, используя 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), то есть нетрансформированный?

1 Ответ

3 голосов
/ 20 сентября 2019

При этом ключи подписи NaCl составляют 64 байта, а не 32. Следовательно, вы получаете ошибку.

В функции base58KeyPairGenerator секретный ключ должен быть выходным значением nacl.sign.keyPair.fromSeed(seed).secretKey (или .privateKey или как там это называется), а не просто семя.

...