2015-04-26 55 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

相關問題