2013-04-10 25 views
1

代碼1:(一個簡單的方法來SHA1結果轉換爲字符串)如何評估這2個哈希函數?

byte[] bs = System.Text.Encoding.UTF8.GetBytes(input); 
SHA1CryptoServicesProvider x = new SHA1CryptoServicesProvider(); 
bs = x.ComputeHash(bs); 
System.Text.StringBuilder s = new System.Text.StringBuilder(); 
foreach (byte b in bs) 
    s.Append(b.ToString("x2").ToLower()); 
result1 = s.ToString(); 

代碼2:(遺留在項目存在從世界的開始代碼)

byte[] bs = System.Text.ASCIIEncoding.GetBytes(input); 
SHA1CryptoServicesProvider x = new SHA1CryptoServicesProvider(); 
bs = x.ComputeHash(bs); 
char[] c = new char[bs.length] 
for(int i=0; i<bs.length; i++) 
    c[i] = (char)(bs[i] & 0x7f); 
resutl2 = new StringBuilder().Append(c).ToString(); 

有任何map()函數來評估result1result2

result1 == map(result2) 

又是什麼 「代碼2」 0x7f是什麼意思?

+1

您的意思是「評估result1與result2」究竟是什麼意思? – 2013-04-10 05:47:50

+0

0x7f是一個十六進制數7f。 f是15和7是7,所以它將是二進制的0111 1111,或十進制的127 – Patashu 2013-04-10 05:48:19

+0

'0x7f' in ascii mean **(del)** – 2013-04-10 05:49:08

回答

2

0x7f代表「代碼2」是什麼意思?

& 0x7f裝置& 128,即,強制輸出保持純ASCII(ASCII僅使用7位)「僅第一(最低顯著)7位保持」 - 通過簡單地丟掉該沒有按任何信息不適合。

是否有任何map()功能評估result1result2

最大的問題,不過,在開始使用不同的編碼:除非input永遠只包括ASCII文本(即,其中僅使用前7位字符),則正在散列完全不同的字節陣列( bs),所以最終的輸出不會以任何方式均衡。由於哈希不是可逆的,所以你無法彌補這一點。

2

你的第二個代碼是錯誤的四種方式:

  • 它假定輸入字符串是完全由ASCII字符。 (你的第一個代碼應對所有的Unicode)
  • 它通過使用b & 0x7f丟失結果中每個字節的最高位 - 這與二進制值01111111只是一個按位「AND」,所以結果在範圍0 0-255 -127代替
  • 它在許多情況下,這很可能最終在一些轉換被損壞的非打印文本結束
  • (遠東不太重要的)這是使用無故StringBuilder的;最後一行可能只是

    result2 = new string(c); 
    

給定一個result1值,你可以工作了原文是否會映射到一個給定的result2值(假設原文是擺在首位ASCII) ,但是你不能反過來工作,因爲數據已經丟失。 (有幾個result2值可能會產生相同的result1值。)這甚至假設您完全可以獲得確切的result2值 - 由於最終使用控制字符的方式,您可能會發現更多數據丟失。

0

在代碼1中,我們看到:

s.Append(b.ToString("x2").ToLower());

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx我們看到字節的toString(「X2」),意味着每個字節將被呈現爲兩個十六進制數字,然後小寫 - 這樣0A ,F9等

但在代碼2中我們看到:

c[i] = (char)(bs[i] & 0x7f);

d oing(bs [i] & 0x7f);意味着我們在將它放入返回值之前刪除第8位(將其設置爲0)。這意味着我們在原始哈希中丟失了信息 - 約有八分之一被刪除。這意味着我們無法確定result1將使用result2上的任何函數 - 但您可以按照其他方式進行操作,通過將result1轉換回字節數組,可以在result1上執行一個函數。

如果代碼2的意圖是使散列打印字符串,base64編碼是一個好主意(谷歌它)(當然,可打印的十六進制編碼是細太)

另外,既碼1和代碼2在開始時使用不同的編碼。如果傳遞給代碼1/2的字符串包含unicode,而不僅僅是純ASCII,則會立即產生不同的哈希值,這是不可調和的。

+0

meh; base-64刮12個字符(base-64中的28個,十六進制中的40個),但很難說base64比hex更「好」。他們都以完美的循環方式傳達數據。 – 2013-04-10 05:58:26

+0

我沒有說base64比hex要好 - 我說它比扔掉散列信息的1/8更好! :) – Patashu 2013-04-10 06:05:15