2017-09-03 124 views
0

我寫了下面的代碼提取ECDH公共密鑰團:爲什麼公鑰BLOB在.net framework 4.7中以big endian格式包含密鑰類型和密鑰長度?

 var curve = ECCurve.NamedCurves.nistP256; 
     ECDiffieHellman ecdh = ECDiffieHellman.Create(curve); 

     var bytes = ecdh.PublicKey.ToByteArray(); 
     Console.WriteLine($"Public Key (byte length with format info): {bytes.Length}"); 

     var hexString = BitConverter.ToString(bytes).Replace("-", string.Empty); 
     Console.WriteLine($"Public Key (hex with format info): {hexString}"); 

我得到了以下的輸出:

  • 公鑰(與格式信息的字節長度):72

  • 公鑰(十六進制格式信息):45434B3120000000C3F1AC1F3D272BE14A26BE35B1A31F6C969425259162C06BEBE6AE977809984FC509ED5154E1E4782079D4BDDCDA6E083E48D271755267AD765CAD0E66B9FD9F

前4個字節(密鑰類型)是45434B31(十六進制格式)。這似乎是大端格式,其中this MSDN link指示它應該是小端格式,這意味着這4個字節應該是314B4345(同樣,如本鏈接所示)。該鏈接還使用「魔術」,而不是「鑰匙類型」。接下來的4個字節是20000000(十六進制格式)似乎是小尾數格式(如上面的鏈接所示)。

是否有一個合理的解釋,爲什麼鍵類型被格式化爲大端?或者我在這裏錯過了什麼?

+0

Little-endian表示最低有效字節(0x45)首先出現。 – wRAR

回答

1

前4個字節(密鑰類型)是45434B31(十六進制格式)。

這將是0x45434B31(大端解釋),或0x314B4345(小Endian解釋)。 0x314B4345(LE)與鏈接頁面中的nistP256條目匹配。

你的問題標題表明你相信長度被存儲爲big endian,但是你說的問題主體似乎是小端。 LE是正確的。 200000000x00000020(LE)或「32字節字段」。 32字節是256位,與nistP256的預期答案相匹配。


請注意,你真的不想使用這種blob格式。 NIST P-256,384和521曲線有不同的「魔術」值,但新的Windows 10附加曲線全部報告在0x504B4345(BCRYPT_ECDH_PUBLIC_GENERIC_MAGIC)之下。曲線名稱必須由外部進行。

.NET中用於導入和導出鍵值的正確答案是通過ExportParametersImportParameters方法的ECParameters結構。

+0

對於我在密鑰長度上的寫法,你是正確的。但是,爲什麼當實際值顯示爲大端時,文檔中說「魔術」(關鍵類型)應該是小尾數? – Raghu

+0

該文檔將該值顯示爲數字常量。 Big/Little Endian是關於價值的存儲。如果(在C中)你在x86/x64系統上寫了'* blob = 0x314B4345',然後檢查內存,它會顯示爲'45 43 4B 31' – bartonjs

+0

我同意你的看法,因爲這是一個正常的存儲問題。當我調用ToByteArray()並獲得結果字節時,我不再解釋字節(就像我已經完成的那樣)。因此,爲了一致性,我會將第一個字節8看作314B434520000000(而不是45434B3120000000)。我在這裏錯過了什麼嗎? – Raghu