修正BUG SHA 256演算法 C語言實現

2021-06-28 18:58:31 字數 3241 閱讀 7695

感謝 qq_20453319 提醒,現已修正bug

實現了計算字串,檔案的sha-256值

演算法來自:

vs2013下成功編譯執行

1.如果出現 _ftelli64未定義 的錯誤,將_ftelli64替換為ftello64。visual c應該不會有這種錯誤。

2.函式的第三個引數是計算後的字串形式,不需要再轉換,詳情看示例**。

3.預設計算結果是大寫形式,如需小寫,將函式中末尾處所有 %08x 替換為 %08x 即可。

/*用法示例*/

**如下:

#include 

#include

#define sha256_rotl(a,b) (((a>>(32-b))&(0x7fffffff>>(31-b)))|(a>b)&(0x7fffffff>>(b-1)))

#define sha256_ch(x,y,z) ((x&y)^((~x)&z))

#define sha256_maj(x,y,z) ((x&y)^(x&z)^(y&z))

#define sha256_e0(x) (sha256_rotl(x,30)^sha256_rotl(x,19)^sha256_rotl(x,10))

#define sha256_e1(x) (sha256_rotl(x,26)^sha256_rotl(x,21)^sha256_rotl(x,7))

#define sha256_o0(x) (sha256_rotl(x,25)^sha256_rotl(x,14)^sha256_sr(x,3))

#define sha256_o1(x) (sha256_rotl(x,15)^sha256_rotl(x,13)^sha256_sr(x,10))

extern

char* strsha256(const

char* str, long

long length, char* sha256);

l = length + ((length % 64 >= 56) ? (128 - length % 64) : (64 - length % 64));

if (!(pp = (char*)malloc((unsigned

long)l))) return

0; for (i = 0; i < length; pp[i + 3 - 2 * (i % 4)] = str[i], i++);

for (pp[i + 3 - 2 * (i % 4)] = 128, i++; i < l; pp[i + 3 - 2 * (i % 4)] = 0, i++);

*((long*)(pp + l - 4)) = length << 3;

*((long*)(pp + l - 8)) = length >> 29;

for (ppend = pp + l; pp < ppend; pp += 64)

h0 += a, h1 += b, h2 += c, h3 += d, h4 += e, h5 += f, h6 += g, h7 += h;

}free(pp - l);

sprintf(sha256, "%08x%08x%08x%08x%08x%08x%08x%08x", h0, h1, h2, h3, h4, h5, h6, h7);

return sha256;

}extern

char* filesha256(const

char* file, char* sha256);

fh = fopen(file, "rb");

fseek(fh, 0, seek_end);

length = _ftelli64(fh);

addlsize = (56 - length % 64 > 0) ? (64) : (128);

if (!(addlp = (char*)malloc(addlsize))) return

0; cpys = ((length - (56 - length % 64)) > 0) ? (length - length % 64) : (0);

j = (long)(length - cpys);

if (!(pp = (char*)malloc(j))) return

0; fseek(fh, -j, seek_end);

fread(pp, 1, j, fh);

for (i = 0; i < j; addlp[i + 3 - 2 * (i % 4)] = ((char*)pp)[i], i++);

free(pp);

for (addlp[i + 3 - 2 * (i % 4)] = 128, i++; i < addlsize; addlp[i + 3 - 2 * (i % 4)] = 0, i++);

*((long*)(addlp + addlsize - 4)) = length << 3;

*((long*)(addlp + addlsize - 8)) = length >> 29;

for (rewind(fh); 64 == fread(w, 1, 64, fh);)

h0 += a, h1 += b, h2 += c, h3 += d, h4 += e, h5 += f, h6 += g, h7 += h;

}for (pp = addlp, ppend = addlp + addlsize; pp < ppend; pp = (long*)pp + 16)

h0 += a, h1 += b, h2 += c, h3 += d, h4 += e, h5 += f, h6 += g, h7 += h;

}free(addlp); fclose(fh);

sprintf(sha256, "%08x%08x%08x%08x%08x%08x%08x%08x", h0, h1, h2, h3, h4, h5, h6, h7);

return sha256;

}

C 簽名演算法HS256和RS256實戰演練

hs256 使用金鑰生成固定的簽名,rs256 使用成非對稱進行簽名。簡單地說,hs256必須與任何想要驗證 jwt的 客戶端或 api 共享秘密。rs256生成非對稱簽名,這意味著必須使用私鑰來籤簽名 jwt,並且必須使用對應的公鑰來驗證簽名。與對稱演算法不同,使用 rs256 可以保證服務端是 ...

演算法4 7 KMP演算法中的模式串移動陣列(c語言)

題目描述 字串的子串定位稱為模式匹配,模式匹配可以有多種方法。簡單的演算法可以使用兩重巢狀迴圈,時間複雜度為母串與子串長度的乘積。而kmp演算法相對來說在時間複雜度上要好得多,為母串與子串長度的和。但其算符比較難以理解。在kmp演算法中,使用到了乙個next陣列。這個陣列就是在比較失配時母串指標不必...

AES加解密演算法理解與實現(ecb模式) C語言

include include include void aes char char char int void aes detail int 4 4 int 4 4 int void subbytes int 4 4 int void shiftrows int 4 4 int void mixc...