前幾天總結了SHA256的算法原理一文
SHA2系列的原理并不復雜,但是需要注意細節還是挺多的。不少中文博客貼出的代碼都有錯,這兩天也踩了幾個坑。
代碼在這里!!!SHA256的C Code
代碼實現主要依照的這個git倉庫crypto-algorithms,向大家推薦,里面實現了各種加密算法。
代碼正確性的測試
如何測試加密算法是否正確,上一文也提到過
我使用的是一個在線SHA256加密驗證工具
測試了三種不同類型的數據的Hash結果
- 純英文
- 中英文夾雜
- 長消息
邏輯運算
SHA256中使用的所有邏輯運算,使用宏定義的方式實現如下:
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))
1
2
3
4
5
6
7
8
9
算法回顧
這里對SHA256原理進行簡單回顧,方便大家對照源代碼
首先需要將原始消息拆解成512-bit大小的塊
這里寫圖片描述
最后單獨甩出的不完整的塊需要被補全,對應代碼中的sha256_final函數
整體的操作是依次對塊進行Hash映射,第i塊映射的結果是第i+1塊的輸入。這個過程在函數sha256_update中完成
第一個塊的輸入是預設好的hash初值,初始化過程對應代碼中的sha256_init函數
最后一個塊的輸出便是最終的數字摘要
這里寫圖片描述
而其中最關鍵的操作是這個映射函數Map
其內部也相當于是一個循環加密的過錯,不斷將原始信息進行打亂:
這里寫圖片描述
代碼中函數sha256_transform實現了該過程
————————————————
版權聲明:本文為CSDN博主「隨煜而安」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u011583927/article/details/80953491
https://hash.online-convert.com/sha256-generator