在還不了解原理前程式是這樣寫的:
byte[] buff = hexToByte(hex);
SHA1Managed sha1 = new SHA1Managed();
byte[] value = sha1.ComputeHash(buff);
string Code = "";
foreach (var hash in value)
{
Code += hash.ToString("X2");
}
Console.WriteLine(Code);
抱歉我跳過一個步驟,就是程式最一開始還有一個function是將hex code轉成byte,所以我們才能使用ComputeHash()。當然,hex也是陣列,是由0~F的組合。
而value你會得到一個長度為20的byte陣列。
再來我們來看線上SHA1轉換工具:
https://passwordsgenerator.net/sha1-hash-generator/
(介面簡陋,但是textChanged就會自動幫我轉換,省了我回車鍵的時間)
好的,很直覺的,我hex code就是要塞0吧?不對,十六進制要轉成byte,至少要兩位,例如:FF。但是0跟00,得到不都是0嗎?
就這樣來來回回試了好幾回,甚至字串反轉、重複加密等等,讓我懷疑是微軟自創SHA1或是類別設計有問題...= =
終於,我冷靜下來開始觀察:
ComputeHash得到的是20個byte;線上SHA1得到的是40碼的字串
從這裡開始回推,那input為什麼只限定byte而不是字元、字串呢?
啊,應該是ASCII碼:
中了,就是它。DEC 48得到跟線上小工具一樣的hash值。
來下結論吧,微軟提供的SHA1Managed,input值會是對應到字元ASCII的DEC碼,例如:'0'就會是30,'A'就是65。(且要放在byte中,有就是0~255)
但線上的SHA1工具似乎不限於ASCII碼0~255的字元...嗯嗯,如果之後有用到會再另補一篇。
沒有留言:
張貼留言