我在尝试签署交易时收到了消息:
Transaction payment = new Transaction();
BitcoinSecret PaymentSecret = new BitcoinSecret("1sXCvdpXz...UqkXW9mvT");
...
payment.Sign(Container.PaymentSecret, false);
我深入研究了开源NBitcoin API并找出这些行给出了错误信息。我能做什么? (https://github.com/NicolasDorier/NBitcoin/blob/master/NBitcoin/Crypto/DeterministicECDSA.cs)
try
{
hmac = MacUtilities.GetMac(macName);
}
catch(SecurityUtilityException nsae)
{
throw new InvalidOperationException(nsae.Message, nsae);
}
答案 0 :(得分:1)
如果有人想弄清楚究竟发生了什么,那么这里有一个会导致错误的代码段:
string mechanism = "HMACSHA256";
if (mechanism.StartsWith("HMAC"))
{
Console.WriteLine("good");
}
else
{
Console.WriteLine("bad");
}
Console.ReadLine();
如果你设置了机制=" HMAC-SHA256",那么这个错误就不会发生。 如果你使用mechanism.StartsWith(" HMAC",StringComparison.InvariantCulture),那么bug就不会发生。
我还修复了github中的错误,并为NBitcoin API创建了拉取请求,希望将来不会与其他人一起发生。
答案 1 :(得分:1)
问题在于:
NBitcoin / NBitcoin.BouncyCastle /安全/ MacUtilities.cs
public static IMac GetMac(string algorithm)
{
...
if(mechanism.StartsWith("HMAC"))
{
...
}
...
}
机制字符串是" HMACSHA256"并且if语句永远不会为我评估,因为我的语言是匈牙利语和" CS"是匈牙利的一封信。所以根据StartsWith函数" HMACSHA256"并不是以" HMAC"在匈牙利语。
Nicolas Dorier在NBitcoin API中修复了这个问题,将StringComparison.OrdinalIgnoreCase设置添加到StartWith函数。
如果有人想要测试它,这里有来自Nicolas的电子邮件:
好的,历史。
Thread.CurrentThread.CurrentCulture = new CultureInfo("hu");
string mechanism = "HMACSHA256";
var v1 = mechanism.StartsWith("HMAC");
mechanism = "HMAC-SHA256";
var v2 = mechanism.StartsWith("HMAC");
在匈牙利语中,v1为假,v2为真。
答案 2 :(得分:0)
HMAC之后有一个连字符。 HMAC-SHA256
答案 3 :(得分:0)
我刚试过我机器上的代码,它运行得很好。
public void CanSignSimple()
{
Key bob = new Key();
Transaction tx = new Transaction();
tx.Inputs.Add(new TxIn()
{
ScriptSig = bob.ScriptPubKey
});
tx.Sign(bob, false);
}
应该注意的是,我现在没有使用Bouncy城堡图书馆。我复制了bouncycastle INSIDE NBitcoin所需的部分。 您的错误似乎是您正在使用NBitcoin以及官方的BouncyCastle,只有当您使用官方BouncyCastle lib重新编译所有内容时才会发生这种情况,或者您使用的是旧版本的NBitcoin。
您使用的是哪个版本?