NBitcoin抛出InvalidOperationException,并显示消息:“Mac HMACSHA256无法识别”。

时间:2015-04-26 05:27:09

标签: c# .net bitcoin

我在尝试签署交易时收到了消息:

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);
}

4 个答案:

答案 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。

您使用的是哪个版本?