天天看點

SHA-1算法c語言實作

安全雜湊演算法(Secure Hash Algorithm)主要适用于數字簽名标準 (Digital Signature Standard DSS)裡面定義的數字簽名算法(Digital Signature Algorithm DSA)。對于長度小于2^64位的消息,SHA1會産生一個160位的消息摘要。當接收到消息的時候,這個消息摘要可以用來驗證資料的完整性。在傳輸的過程中,資料很可能會發生變化,那麼這時候就會産生不同的消息摘要。 SHA1有如下特性:不可以從消息摘要中複原資訊;兩個不同的消息不會産生同樣的消息摘要。

算法實作的版本比較多,以下代碼來自:http://download.csdn.net/detail/zhangrulzu/2936159,代碼行數很少,但确實實作了想要的效果。

下載下傳的SHA-1算法:

這裡對算法驗證過程做一個記錄說明:

Visual Studio 2005,檔案》建立》項目》Visual c++》Win32控制台應用程式,輸入項目名稱“SHA1”,完成;

把下載下傳的代碼貼到SHA1.cpp檔案末尾,複制“int _tmain(int argc, _TCHAR* argv[])”,删除_tmain函數,替換“main()”;

編譯代碼,提示以下錯誤:

錯誤 2 error C3861: “strlen”: 找不到辨別符 e:\devlop\sha1\sha1\sha1.cpp 43

錯誤 3 error C2664: “ms_len”: 不能将參數 2 從“unsigned char [64]”轉換為“char []” e:\devlop\sha1\sha1\sha1.cpp 47

錯誤 4 error C3861: “getch”: 找不到辨別符 e:\devlop\sha1\sha1\sha1.cpp 98

第一條是警告,可以不處理

警告 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. e:\devlop\sha1\sha1\sha1.cpp 42

輕按兩下錯誤2,定位到錯誤位置,在“strlen"上單擊滑鼠右鍵》Refactor》Add Include,如下圖:

SHA-1算法c語言實作

如果沒有這一項,那應該是沒有安裝VC助手的原因;

輕按兩下錯誤3,定位到錯誤位置,在變量input前加(char*)強制轉換;

輕按兩下錯誤4,定位到錯誤位置,在“getch"上單擊滑鼠右鍵》Refactor》Add Include;

按F6鍵編譯項目,發現還有錯誤:

錯誤 2 error C2664: “strlen”: 不能将參數 1 從“unsigned char [64]”轉換為“const char *” e:\devlop\sha1\sha1\sha1.cpp 45

輕按兩下錯誤2,定位到錯誤位置,在input前加(LPSTR)強制轉換,編譯,還有錯誤:

錯誤 2 error C2065: “LPSTR”: 未聲明的辨別符 e:\devlop\sha1\sha1\sha1.cpp 45

錯誤 3 error C2146: 文法錯誤 : 缺少“)”(在辨別符“input”的前面) e:\devlop\sha1\sha1\sha1.cpp 45

錯誤 4 error C2059: 文法錯誤 : “)” e:\devlop\sha1\sha1\sha1.cpp 45

還是找不到辨別符,方法一樣:在“LPSTR"上單擊滑鼠右鍵》Refactor》Add Include;

再編譯,又報錯:

錯誤 4 error C4716: “ms_len”: 必須傳回一個值 e:\devlop\sha1\sha1\sha1.cpp 38

定位到錯誤位置,仔細看了一下,這個函數的傳回值應該沒什麼用,随便傳回一個:return '0';

再編譯,OK,終于生成成功了!

F5調試,輸入:abcd,回車,哦,輸出了好多東東,檢視代碼的輸出調用,

找到92行應該沒用,注釋://printf("%lx,%lx,%lx,%lx,%lx\n",A,B,C,D,E);//輸出編碼過程,

最後得到的SHA1哈希值中還有逗号,找到100行,将printf("%lx,%lx,%lx,%lx,%lx",H0,H1,H2,H3,H4);格式化字元串中的逗号去掉;

再編譯,F5調試,輸入:abcd,回車,結果如下圖:

SHA-1算法c語言實作

得到的結果對不對呢,找到一個線上SHA1加密工具,輸入abcd,結果如下:

SHA-1算法c語言實作

對比一下,OK,結果一至。

修改後的SHA-1算法:

繼續閱讀