日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SHA256 的C语言实现

發布時間:2024/7/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SHA256 的C语言实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前幾天總結了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))

算法回顧

這里對SHA256原理進行簡單回顧,方便大家對照源代碼

首先需要將原始消息拆解成512-bit大小的塊

最后單獨甩出的不完整的塊需要被補全,對應代碼中的sha256_final函數

整體的操作是依次對塊進行Hash映射,第i塊映射的結果是第i+1塊的輸入。這個過程在函數sha256_update中完成

第一個塊的輸入是預設好的hash初值,初始化過程對應代碼中的sha256_init函數

最后一個塊的輸出便是最終的數字摘要

而其中最關鍵的操作是這個映射函數Map

其內部也相當于是一個循環加密的過錯,不斷將原始信息進行打亂:


代碼中函數sha256_transform實現了該過程

總結

以上是生活随笔為你收集整理的SHA256 的C语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。