首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言實現SHA-1哈希計算:文件完整性校驗完整代碼

     編輯:關於C

SHA-1 算法簡介

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;
}

核心變換(處理 64 字節塊)

包含 80 輪運算,分四組常數 K1-K4 與函數 F1-F4,展開為宏 R 與 M 以提升效率。完整代碼見原文。

流式處理:sha1_write

支援分塊輸入,自動緩衝、填充、長度附加,最終調用 sha1_final 輸出摘要到 hd->buf。

兩種調用介面

1. 控制台直接輸出版

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]);
}

2. 函數返回值版(適合程式內部調用)

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

已知限制與改進方向

  • 未處理大文件(>2GB)的 64 位長度溢出。
  • 未使用硬體加速(Intel SHA-NI)或 OpenSSL 優化實現。
  • 錯誤處理較簡單,生產環境建議採用成熟庫(OpenSSL、mbedTLS)。

總結

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved