是否可以使用 Tweetnacl 库使用 base58 密钥对消息进行签名?
Is it possible to sign a message with a base58 secret key with Tweetnacl library?
我使用 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 密钥对(public base58 中的密钥和秘密密钥),我想用这样的秘密密钥签署消息:
nacl.sign(
Buffer.from(someStringMessage, 'hex'),
base58.decode(keyPair.secretKey)
)
base58
这里来自 this 图书馆。
但是我得到这个错误:
bad secret key size
at Object.<anonymous>.nacl.sign (node_modules/tweetnacl/nacl-fast.js:2257:11)
确实,nacl.sign
函数需要一个 64 位密钥,而我的 base58 版本不是这样。
有没有办法在保留 base58 的同时修复它,或者我应该使用 nacl.randomBytes(32)
生成的原始 Ed25519 格式,即未转换的格式?
也就是说,NaCl 签名密钥是 64 字节,而不是 32 字节。因此会出现错误。
在 base58KeyPairGenerator
函数中,密钥必须是 nacl.sign.keyPair.fromSeed(seed).secretKey
(或 .privateKey
或其他名称)的输出,而不仅仅是种子。
我使用 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 密钥对(public base58 中的密钥和秘密密钥),我想用这样的秘密密钥签署消息:
nacl.sign(
Buffer.from(someStringMessage, 'hex'),
base58.decode(keyPair.secretKey)
)
base58
这里来自 this 图书馆。
但是我得到这个错误:
bad secret key size
at Object.<anonymous>.nacl.sign (node_modules/tweetnacl/nacl-fast.js:2257:11)
确实,nacl.sign
函数需要一个 64 位密钥,而我的 base58 版本不是这样。
有没有办法在保留 base58 的同时修复它,或者我应该使用 nacl.randomBytes(32)
生成的原始 Ed25519 格式,即未转换的格式?
也就是说,NaCl 签名密钥是 64 字节,而不是 32 字节。因此会出现错误。
在 base58KeyPairGenerator
函数中,密钥必须是 nacl.sign.keyPair.fromSeed(seed).secretKey
(或 .privateKey
或其他名称)的输出,而不仅仅是种子。