2015-10-23 21 views
1

我在.NET 4.5這個工作代碼:sha256.TransformBlock在Win10通用的應用

var sha256 = System.Security.Cryptography.SHA256.Create(); 
var message = new byte[] {1, 2, 3}; 
var s = new byte[32]; 
var m = sha256.ComputeHash(message); 
sha256.TransformBlock(m, 0, m.Length, m, 0); 
sha256.TransformFinalBlock(s, 0, s.Length); 
var x = sha256.Hash; // x = {236, 196, 174, 128, 243....} 

而且我試圖複製其在通用的Windows 10應用程序。 但是我無法在新的.NET庫中的SHA256對象上找到TransformBlock/TransformFinalBlock函數。 我添加了對版本4.0.0-beta-23409 of System.Security.Cryptography.Algorithms的依賴關係。而我得到的錯誤是:

錯誤CS1061:「SHA256」不包含「TransformBlock」,沒有擴展方法「TransformBlock」接受型「SHA256」的第一個參數的定義可以發現( )

錯誤CS1061:'SHA256'未包含'TransformFinalBlock'的定義,也沒有找到接受'SHA256'類型的第一個參數的擴展方法'TransformFinalBlock' (您是否缺少使用指令或程序集引用?)

錯誤CS1061:'SHA256'不包含'哈希'並沒有擴展方法「哈希」接受型「SHA256」的第一個參數可以找到(是否缺少using指令或程序集引用?)

如何實現相同的結果,在.NET 4.5 ?

+0

你爲什麼叫這兩個'ComputeHash'和'TransformBlock'? –

+0

@ScottChamberlain這是一個非常好的問題。我對加密知之甚少。我從Java移植代碼,並且基本上按照他們在原始代碼中所做的那樣逐行進行。 – Stenkross

回答

0

該解決方案在另一個類IncrementalHash中找到。 顯然,微軟希望將HashAlgorithm的有狀態(TransformBlock和TransformFinalBlock)和「無狀態」(ComputeHash)部分分開,因爲它們沒有很好的隔離性。

總之,這裏的如何複製代碼在通用的Windows 10應用程序:

var message = new byte[] { 1, 2, 3 }; 
var s = new byte[32]; 
byte[] m; 
byte[] x; 

using (HashAlgorithm sha256 = SHA256.Create()) 
{ 
    m = sha256.ComputeHash(message); 
} 

using (IncrementalHash sha256 = IncrementalHash.CreateHash(HashAlgorithmName.SHA256)) 
{ 
    sha256.AppendData(m); 
    sha256.AppendData(s); 
    x = sha256.GetHashAndReset(); 
}