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

C語言實現文件 SHA1 哈希值計算:完整源碼、控制台調用與函數封裝三種形態

     編輯:關於C語言

SHA1 算法簡介

安全哈希算法(SHA1)用於數字簽名標準(DSS)中的 DSA。對 < 2^64 位消息生成 160 位摘要,驗證數據完整性。特性:不可逆、抗碰撞(不同消息極難產生相同摘要)。

核心實現(節選關鍵結構與函數)

typedef unsigned int u32;

typedef struct {
    u32 h0,h1,h2,h3,h4;
    u32 nblocks;
    unsigned char buf[64];
    int count;
} SHA1_CONTEXT;

void sha1_init(SHA1_CONTEXT *hd) { /* 初始化魔數 */ }
static void transform(SHA1_CONTEXT *hd, unsigned char *data) { /* 80 輪壓縮 */ }
static void sha1_write(SHA1_CONTEXT *hd, unsigned char *inbuf, size_t inlen) { /* 流式處理 */ }
static void sha1_final(SHA1_CONTEXT *hd) { /* 填充、長度追加、最終輸出 */ }

完整實現包含大端/小端適配、滾動移位優化(GCC x86 內聯彙編)、常量 K1-K4、邏輯函數 F1-F4、消息擴展宏 M(i)、輪函數宏 R() 等。

形態一:控制台直接調用

void GetFileSHA1(char *FileNameInPut) {
    if (!FileNameInPut) { printf("Usage:  \n"); return; }
    FILE *fp; char buffer[4096]; size_t n;
    SHA1_CONTEXT ctx; int i;
    fopen_s(&fp, FileNameInPut, "rb");
    if (!fp) { printf("打開文件失敗\n"); return; }
    sha1_init(&ctx);
    while ((n = fread(buffer, 1, sizeof buffer, fp))) sha1_write(&ctx, (unsigned char*)buffer, n);
    if (ferror(fp)) { printf("讀取失敗\n"); return; }
    sha1_final(&ctx); fclose(fp);
    for (i=0; i<20; i++) printf("%02x", ctx.buf[i]);
}

形態二:函數封裝返回值(適合程序調用)

char *GetFileSHA1(char *FileNameInPut, char *outSHA1, char *outError) {
    if (!FileNameInPut) { if (outError) sprintf(outError, "FileNameInPut Is NULL"); return outSHA1; }
    FILE *fp; char buffer[4096]; size_t n;
    SHA1_CONTEXT ctx; int i;
    fopen_s(&fp, FileNameInPut, "rb");
    if (!fp) { if (outError) sprintf(outError, "打開文件失敗"); return outSHA1; }
    sha1_init(&ctx);
    while ((n = fread(buffer, 1, sizeof buffer, fp))) sha1_write(&ctx, (unsigned char*)buffer, n);
    if (ferror(fp)) { if (outError) sprintf(outError, "讀取失敗"); return outSHA1; }
    sha1_final(&ctx); fclose(fp);
    for (i=0; i<20; i++) sprintf(outSHA1 + 2*i, "%02x", (unsigned char)ctx.buf[i]);
    outSHA1[40] = '\0';
    return outSHA1;
}

使用示例

int main(int argc, char **argv) {
    GetFileSHA1(*(argv+1)); printf("\r\n");
    char sha1[41] = {0}, eror[256] = {0};
    printf("%s\r\n", GetFileSHA1(*(argv+1), sha1, NULL));
    if (strlen(eror)) printf("錯誤:%s\r\n", eror);
    printf("%s\r\n", GetFileSHA1(*(argv+1), sha1, eror));
    if (strlen(eror)) printf("錯誤:%s\r\n", eror);
    getchar(); return 0;
}

命令行效果

命令提示符下用法

源碼下載

CSDN 下載鏈接

注意事項

  • 作者聲明水平有限,歡迎指正優化
  • Windows 下使用 fopen_s,Linux 需改用 fopen
  • 大文件流式處理,內存佔用恆定(4KB 緩衝區)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved