2015-04-26 56 views
1

我得到的消息时,我尝试登入交易:NBitcoin抛出InvalidOperationException异常消息:“Mac HMACSHA256无法识别。”

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

回答

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函数中。

如果有人想测试一下,这里是从萨科电子邮件:

好,因为历史。

Thread.CurrentThread.CurrentCulture = new CultureInfo("hu"); 
string mechanism = "HMACSHA256"; 
var v1 = mechanism.StartsWith("HMAC"); 

mechanism = "HMAC-SHA256"; 
var v2 = mechanism.StartsWith("HMAC"); 

在匈牙利,V1是假的和v2真。

0

HMAC后面有一个连字符。 HMAC-SHA256

+0

事实上,它的工作方式。 – nopara73

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。

您使用的是什么版本?

+0

没有这种情况,我正在使用NuGet的最新版本。 我刚刚建立了自己的NBitcoin.dll。 在'DeterministicECDSA.cs'文件/'公共DeterministicECDSA(String hashName)'函数中,如果我手动将'macName'变量改为'“HMAC-SHA256”'而不是'“HMACSHA256”',它就会起作用。 当你在'hmac = MacUtilities.GetMac(macName);'行之前调试时,你的'macName'变量的值是多少? – nopara73

+0

你可以运行我给你的代码吗?我刚刚创建了一个新项目,安装了nbitcoin并运行了代码,但没有设法重现您的错误。我的版本没有“ - ”,并且通过在NBitcoin源代码中的MacUtilities中一步一步地处理它,它正确地处理它。 (HMACSHA256) –

+0

从[MacUtilities](https://github.com/NicolasDorier/NBitcoin/blob/master/NBitcoin.BouncyCastle/security/MacUtilities.cs#L103)中,您可以看到我正确处理了两种情况,没有冲刺。 –

1

如果有人想弄清楚究竟是什么发生了,这里有一个代码段会导致错误:如果设置机制

string mechanism = "HMACSHA256"; 
    if (mechanism.StartsWith("HMAC")) 
    { 
     Console.WriteLine("good"); 
    } 
    else 
    { 
     Console.WriteLine("bad"); 
    } 
    Console.ReadLine(); 

=“HMAC-SHA256”,则错误赢得了”不会发生。 如果使用mechanism.StartsWith(“HMAC”,StringComparison.InvariantCulture),则不会发生错误。

我还修复了github中的bug,并创建了一个对NBitcoin API的拉取请求,所以希望它在将来不会发生。

+0

我复制并粘贴了这段代码,它在我的机器上工作正常。你的语言是什么?这是一个非常有趣的错误。 –

+0

我在想,也许stackoverflow在这里做了一些魔术,但我已经创建了一个新项目,copypasted,并且错误仍然存​​在。 – nopara73

+0

我有匈牙利语键盘,但在我的电脑(windows,visualstudio)中运行了所有软件。此外,我现在在台湾,但这不重要。我通过邮件发送了你的'System.Threading.Thread.CurrentThread.CurrentUICulture',希望对你有所帮助。 – nopara73

相关问题