我正在尝试使用 Hive 网络中的 PostingKey 对短消息进行签名。我正在尝试使用 BouncyCastle,但我无法初始化它的签名者,我的(不太好的代码)看起来像这样:
public static class Signer
{
public static byte[] Sign(string message, byte[] privateKey)
{
var signer = new Org.BouncyCastle.Crypto.Signers.ECDsaSigner(new HMacDsaKCalculator(new Sha256Digest()));
var bigInt = new BigInteger(privateKey);
var parameters = new ECPrivateKeyParameters(bigInt, new ECDomainParameters())
signer.Init(false, parameters);
var messageBytes = Encoding.UTF8.GetBytes(message);
var signature = signer.GenerateSignature(messageBytes);
return signature;
}
}
我很可能做错了什么(或一切)。
密钥如下所示: 5KN6ZfGZgH1puWwH1Nc1P8xyrFZSPHDw3WUP6iitsjCECJLrGBq 然后将其编码为 32 字节数组。
我有在 JavaScript 中工作的示例代码,但我未能让它在 C# 中运行
eosjs_ecc.sign("message", "key")
已编辑:所以我设法生成了与 JavaScript 中生成的大小相匹配的签名,但我仍然无法在 dApp 中唱歌。我现在正在使用 Cryptography.ECDSA 库,因为它可以在一次调用中生成带有恢复号、r 和 s 的签名。唯一的问题是每次我调用相同的值时签名都是不同的。
var buffer = Secp256K1Manager.SignCompressedCompact(message, privateKey);
var checksum = Ripemd160Manager.GetHash(buffer);
var signatureArray = buffer.Concat(checksum.Take(4)).ToArray();
var result = Base58.Encode(signatureArray);
return $"SIG_K1_{result}";