📄 sha512.c
字号:
#include <stdio.h>
#include <string.h>
#if defined(DJGPP) || defined(__CYGWIN__)
typedef unsigned long long UINT64;
#else
#include <basetsd.h>
#endif
typedef struct {
UINT64 state [8], length, curlen;
unsigned char buf [128];
} sha_state512;
/*常数数组K*/
static const UINT64 K [80] =
{
0x428A2F98D728AE22, 0x7137449123EF65CD, 0xB5C0FBCFEC4D3B2F, 0xE9B5DBA58189DBBC,
0x3956C25BF348B538, 0x59F111F1B605D019, 0x923F82A4AF194F9B, 0xAB1C5ED5DA6D8118,
0xD807AA98A3030242, 0x12835B0145706FBE, 0x243185BE4EE4B28C, 0x550C7DC3D5FFB4E2,
0x72BE5D74F27B896F, 0x80DEB1FE3B1696B1, 0x9BDC06A725C71235, 0xC19BF174CF692694,
0xE49B69C19EF14AD2, 0xEFBE4786384F25E3, 0x0FC19DC68B8CD5B5, 0x240CA1CC77AC9C65,
0x2DE92C6F592B0275, 0x4A7484AA6EA6E483, 0x5CB0A9DCBD41FBD4, 0x76F988DA831153B5,
0x983E5152EE66DFAB, 0xA831C66D2DB43210, 0xB00327C898FB213F, 0xBF597FC7BEEF0EE4,
0xC6E00BF33DA88FC2, 0xD5A79147930AA725, 0x06CA6351E003826F, 0x142929670A0E6E70,
0x27B70A8546D22FFC, 0x2E1B21385C26C926, 0x4D2C6DFC5AC42AED, 0x53380D139D95B3DF,
0x650A73548BAF63DE, 0x766A0ABB3C77B2A8, 0x81C2C92E47EDAEE6, 0x92722C851482353B,
0xA2BFE8A14CF10364, 0xA81A664BBC423001, 0xC24B8B70D0F89791, 0xC76C51A30654BE30,
0xD192E819D6EF5218, 0xD69906245565A910, 0xF40E35855771202A, 0x106AA07032BBD1B8,
0x19A4C116B8D2D0C8, 0x1E376C085141AB53, 0x2748774CDF8EEB99, 0x34B0BCB5E19B48A8,
0x391C0CB3C5C95A63, 0x4ED8AA4AE3418ACB, 0x5B9CCA4F7763E373, 0x682E6FF3D6B2B8A3,
0x748F82EE5DEFB2FC, 0x78A5636F43172F60, 0x84C87814A1F0AB72, 0x8CC702081A6439EC,
0x90BEFFFA23631E28, 0xA4506CEBDE82BDE9, 0xBEF9A3F7B2C67915, 0xC67178F2E372532B,
0xCA273ECEEA26619C, 0xD186B8C721C0C207, 0xEADA7DD6CDE0EB1E, 0xF57D4F7FEE6ED178,
0x06F067AA72176FBA, 0x0A637DC5A2C898A6, 0x113F9804BEF90DAE, 0x1B710B35131C471B,
0x28DB77F523047D84, 0x32CAAB7B40C72493, 0x3C9EBE0A15C9BEBC, 0x431D67C49C100D4C,
0x4CC5D4BECB3E42B6, 0x597F299CFC657E2A, 0x5FCB6FAB3AD6FAEC, 0x6C44198C4A475817,
};
#define USE_DEFINE
#ifdef USE_DEFINE
#define Ch(x,y,z) ((x & y) ^ (~x & z))
#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
#define S(x, n) (((x)>>(n))|((x)<<(64-n)))
#define R(x, n) ((x)>>(n))
#define Sigma0(x) (S(x, 28) ^ S(x, 34) ^ S(x, 39))
#define Sigma1(x) (S(x, 14) ^ S(x, 18) ^ S(x, 41))
#define Gamma0(x) (S(x, 1 ) ^ S(x, 8 ) ^ R(x, 7 ))
#define Gamma1(x) (S(x, 19) ^ S(x, 61) ^ R(x, 6 ))
#endif
#ifdef USE_INLINE
USE_INLINE UINT64 Ch (UINT64 x, UINT64 y, UINT64 z)
{
return (x & y) ^ (~x & z);
}
USE_INLINE UINT64 Maj (UINT64 x, UINT64 y, UINT64 z)
{
return (x & y) ^ (x & z) ^ (y & z);
}
USE_INLINE UINT64 rotateRight (UINT64 x, UINT64 n)
{
#ifdef __LCC__
return (x >> n) | (x << (n=64 - n));
#else
return (x >> n) | (x << (64 - n));
#endif
}
USE_INLINE UINT64 shiftRight (UINT64 x, UINT64 n)
{
return x >> n;
}
USE_INLINE UINT64 Sigma0 (UINT64 x)
{
return (rotateRight (x, 28) ^ rotateRight (x, 34) ^ rotateRight (x, 39));
}
USE_INLINE UINT64 Sigma1 (UINT64 x)
{
return rotateRight (x, 14) ^ rotateRight (x, 18) ^ rotateRight (x, 41);
}
USE_INLINE UINT64 Gamma0 (UINT64 x)
{
return rotateRight (x, 1) ^ rotateRight (x, 8) ^ shiftRight (x, 7);
}
USE_INLINE UINT64 Gamma1 (UINT64 x)
{
return rotateRight (x, 19) ^ rotateRight (x, 61) ^ shiftRight (x, 6);
}
#endif
/* 压缩成1024个分组*/
static void sha_compress(sha_state512 *md)
{
UINT64 S [8], W [80], t0, t1;
int i;
/* 将缓冲区复制入S数组 */
memcpy (S, md->state, 64);
/* 初始化W0-15*/
for (i = 0; i < 128; i+=8)
W [i>>3] =
((UINT64)md->buf [i + 0]) << 56 |
((UINT64)md->buf [i + 1]) << 48 |
((UINT64)md->buf [i + 2]) << 40 |
((UINT64)md->buf [i + 3]) << 32 |
((UINT64)md->buf [i + 4]) << 24 |
((UINT64)md->buf [i + 5]) << 16 |
((UINT64)md->buf [i + 6]) << 8 |
((UINT64)md->buf [i + 7]);
/* 初始化 W16-79 */
for (i = 16; i < 80; i++)
{
W [i] = Gamma1 (W [i - 2]) + W [i - 7];
W [i] += Gamma0 (W [i - 15]) + W [i - 16];
}
/*压缩*/
for (i = 0; i < 80; i++)
{
t0 = S[7] + Sigma1 (S [4]) + Ch (S [4], S [5], S [6]) + K [i] + W [i];
t1 = Sigma0 (S [0]) + Maj (S [0], S [1], S [2]);
S [7] = S [6];
S [6] = S [5];
S [5] = S [4];
S [4] = S [3] + t0;
S [3] = S [2];
S [2] = S [1];
S [1] = S [0];
S [0] = t0 + t1;
}
for (i = 0; i < 8; i++)
md->state[i] += S[i];
}
/* 初始化缓冲区*/
void sha_init512(sha_state512 *md)
{
md->curlen = md->length = 0;
md->state [0] = 0x6A09E667F3BCC908;
md->state [1] = 0xBB67AE8584CAA73B;
md->state [2] = 0x3C6EF372FE94F82B;
md->state [3] = 0xA54FF53A5F1D36F1;
md->state [4] = 0x510E527FADE682D1;
md->state [5] = 0x9B05688C2B3E6C1F;
md->state [6] = 0x1F83D9ABFB41BD6B;
md->state [7] = 0x5BE0CD19137E2179;
}
void sha_process512(sha_state512 *md, unsigned char *buf, int len)
{
while (len--)
{
/*复制*/
md->buf[md->curlen++] = *buf++;
/* 判断*/
if (md->curlen == 128)
{
sha_compress(md);
md->length += 1024;
md->curlen = 0;
}
}
}
void sha_done512(sha_state512 *md, unsigned char *hash)
{
int i;
md->length += md->curlen << 3;
md->buf[md->curlen++] = 0x80;
if (md->curlen >= 112)
{
for (; md->curlen < 128; )
md->buf[md->curlen++] = 0;
sha_compress(md);
md->curlen = 0;
}
for (; md->curlen < 112; )
md->buf[md->curlen++] = 0;
for (i = 112; i < 120; i++)
md->buf[i] = 0;
for (i = 120; i < 128; i++)
md->buf [i] = (md->length >> ((127-i)<<3)) & 255;
sha_compress(md);
for (i = 0; i < 64; i++)
hash[i] = md->state [i>>3] >> (((7-i)&7)<<3);
}
int sha_file(unsigned char *filename, unsigned char *hash)
{
unsigned char buf[1024];
int i;
FILE *in;
sha_state512 md;
sha_init512(&md);
in = fopen(filename, "rb");
if (!in) return 0;
do {
i = fread(buf, 1, 1024, in);
sha_process512(&md, buf, i);
} while (i == 1024);
sha_done512(&md, hash);
fclose(in);
return 1;
}
int main(int argc, char *argv [])
{
int i, i2;
unsigned char buf[64];
if (argc == 1)
{
printf("进行SHA512散列函数验证:\n命令行格式为:%s filename.txt\n", argv[0]);
return 0;
}
for (i2 = 1; i2 < argc; i2++)
if (sha_file(argv[i2], buf))
{
printf("\n%s:\n",argv[i2]);
for (i = 0; i < 64; )
{
printf("%02x", buf[i]);
if (!(++i & 7)) printf(" ");
if (i == 32)
printf("\n");
}
printf("\n");
}
else
printf("%20s: file not found.\n", argv[i2]);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -