SHA-1(Secure Hash Algorithm 1)是 FIPS PUB 180-1 標準化的密碼學哈希函數,輸入任意長度(< 264 位)消息,產出 160 位(20 字節)消息摘要。核心特性:
0x80(10000000),再補 0x00 直到長度 ≡ 448 mod 512typedef struct {
uint32_t Intermediate_Hash[5]; // 5 個 32 位字 = 160 位摘要
uint32_t Length_Low, Length_High; // 64 位比特長度
uint16_t Message_Block_Index; // 當前填充位置
uint8_t Message_Block[64]; // 512 位緩衝區
int Computed; // 摘要是否已計算
int Corrupted; // 上下文是否損壞
} SHA1Context;
context->Intermediate_Hash[0] = 0x67452301; context->Intermediate_Hash[1] = 0xEFCDAB89; context->Intermediate_Hash[2] = 0x98BADCFE; context->Intermediate_Hash[3] = 0x10325476; context->Intermediate_Hash[4] = 0xC3D2E1F0; // 標準 IV(大端序)
Message_BlockLength_Low += 8,進位到 Length_High)SHA1ProcessMessageBlockCorrupted處理 512 位塊,擴展為 80 個 32 位字 W[0..79]:
// 前 16 字直接取自塊(大端序組裝)
for (t=0; t<16; t++)
W[t] = (block[4*t]<<24) | (block[4*t+1]<<16) | (block[4*t+2]<<8) | block[4*t+3];
// 後 64 字由前序字循環左移異或產生
for (t=16; t<80; t++)
W[t] = ROTL(1, W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
然後 80 輪主迴路,分 4 階段,每階段 20 輪,使用不同非線性函數 f 和常數 K:
| 輪次 | 函數 f(B,C,D) | 常數 K |
|---|---|---|
| 0-19 | (B∧C) ∨ (¬B∧D) | 0x5A827999 |
| 20-39 | B ⊕ C ⊕ D | 0x6ED9EBA1 |
| 40-59 | (B∧C) ∨ (B∧D) ∨ (C∧D) | 0x8F1BBCDC |
| 60-79 | B ⊕ C ⊕ D | 0xCA62C1D6 |
每輪更新 5 個工作變量 A,B,C,D,E,最終加回 Intermediate_Hash。
0x80、補零、寫入 64 位大端長度ProcessMessageBlock 完成最後一塊>2] >> (8 * (3 - (i & 3)));
SHA-1 規範要求大端序(網絡序):
W[t] = (b0<<24) | (b1<<16) | (b2<<8) | b3小端機器(x86、ARM)必須顯式轉換,不可直接強轉指針,否則摘要錯誤。
| 輸入 | 重複次數 | 期望摘要(十六進制) |
|---|---|---|
| "abc" | 1 | A9 99 3E 36 47 06 81 6A BA 3E 25 71 78 50 C2 6C 9C D0 D8 9D |
| "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" | 1 | 84 98 3E 44 1C 3B D2 6E BA AE 4A A1 F9 51 29 E5 E5 46 70 F1 |
| "a" | 1,000,000 | 34 AA 97 3C D4 C4 DA A4 F6 1E EB 2B DB AD 27 31 65 34 01 6F |
Init → Update(data, len) × n → Final(digest),支持大文件/網絡流SHA_SUCCESS, SHA_NULL_PTR, SHA_INPUT_TOO_LONG, SHA_STATE_ERRORFinal 後務必 memset(ctx, 0, sizeof(*ctx))-std=c99 -Wall -Wextra -O2 -D_POSIX_C_SOURCE=200809L鉴于 SHA-1 已被攻破,生產環境請使用:
openssl/sha.h 提供 SHA256_Init/Update/Final本實現嚴格遵循 RFC 3174,代碼結構清晰、邊界處理完善,適合教學研究與舊系統維護。新項目請直接選用 SHA-2 族或更現代算法。