SHA-1(Secure Hash Algorithm 1)輸出 160 位(20 字節)消息摘要,廣泛用於數字簽名、文件完整性校驗。特性:不可逆、抗碰撞(理論上)。
typedef unsigned int u32;
typedef struct {
u32 h0, h1, h2, h3, h4; // 五個 32 位鏈接變數
u32 nblocks; // 已處理 64 字節塊數
unsigned char buf[64]; // 輸入緩衝區
int count; // 緩衝區當前字節數
} SHA1_CONTEXT;
void sha1_init(SHA1_CONTEXT *hd) {
hd->h0 = 0x67452301;
hd->h1 = 0xefcdab89;
hd->h2 = 0x98badcfe;
hd->h3 = 0x10325476;
hd->h4 = 0xc3d2e1f0;
hd->nblocks = 0;
hd->count = 0;
}
包含 80 輪運算,分四組常數 K1-K4 與函數 F1-F4,展開為宏 R 與 M 以提升效率。完整代碼見原文。
sha1_write支援分塊輸入,自動緩衝、填充、長度附加,最終調用 sha1_final 輸出摘要到 hd->buf。
void GetFileSHA1(char *FileNameInPut) {
FILE *fp; char buffer[4096]; SHA1_CONTEXT ctx;
fopen_s(&fp, FileNameInPut, "rb");
sha1_init(&ctx);
while ((n = fread(buffer, 1, sizeof buffer, fp)))
sha1_write(&ctx, (unsigned char*)buffer, n);
sha1_final(&ctx);
fclose(fp);
for (int i=0; i<20; i++) printf("%02x", ctx.buf[i]);
}
char *GetFileSHA1(char *FileNameInPut, char *outSHA1, char *outError) {
// 參數檢查、錯誤信息寫入 outError
// 計算完成後將 20 字節摘要格式化為 40 字符十六進制字符串存入 outSHA1
// outSHA1 需預分配至少 41 字節(含結束符)
return outSHA1;
}
int main(int argc, char **argv) {
char sha1[41] = {0}, err[256] = {0};
GetFileSHA1(argv[1], sha1, err);
if (strlen(err)) printf("Error: %s\n", err);
else printf("SHA1: %s\n", sha1);
return 0;
}

CSDN: https://download.csdn.net/detail/testcs_dn/7332933
本文提供完整、可編譯運行的 SHA-1 純 C 實現,適合嵌入式、無依賴環境或教學參考。實際項目中優先考慮成熟加密庫。