2021-11-27

[C#]SHA1Managed小發現

最近為了驗證一支公司的小程式,研究了一番SHA1加密,以及System.Security.Cryptography提供的SHA1Managed()和底下的方法。

在還不了解原理前程式是這樣寫的:

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碼:

http://shihyu.github.io/books/apas01.html

以字元'0'來說,有可能是48、30、60(060)。那就丟程式跑跑看吧^^



中了,就是它。DEC 48得到跟線上小工具一樣的hash值。


來下結論吧,微軟提供的SHA1Managed,input值會是對應到字元ASCII的DEC碼,例如:'0'就會是30,'A'就是65。(且要放在byte中,有就是0~255)

但線上的SHA1工具似乎不限於ASCII碼0~255的字元...嗯嗯,如果之後有用到會再另補一篇。

沒有留言:

張貼留言