感謝 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...