SHA-1算法问题

Anansi_safe 2020-05-17 01:55:17
求助,为何这个代码算出的sha-1值不对,哪里有错,代码:

void SHA1::Sha1Encode
(
_In_ const char* text,
_In_ size_t len,
_Inout_ unsigned char* outData
)
{
/*
*常量初始化
*/
unsigned long k = 0, f = 0;
unsigned long temp_ul_text[80];
unsigned long temp_A = 0;
unsigned long h[] = { 0x67452301,0xefcdab89,0x98badcfe,0x10325476,0xc3d2e1f0 };
/*
*开始填充原文
*/
size_t n_len = ((len + 8) / 64) * 64 + 56 + 8;
unsigned char*n_text = (unsigned char*)malloc(n_len);
memset(n_text, 0x00, n_len);
memcpy(n_text, text, len);
n_text[len] = 0x80;
unsigned char c_lens[8];
memset(c_lens, 0x00, 8);
unsigned long temp_len = (unsigned long)(len * 8);
memcpy(c_lens, &temp_len, sizeof(unsigned long));
memcpy(n_text + (n_len - 8), c_lens, 8);
/*
//调试代码,查看填充后数据
for (int i = 0; i < n_len; i++)
printf("%d ", n_text[i]);*/

/*
*分组计算,512bits一组
*/
for (int i = 0; i < n_len; i += 64)
{
//A=H[0],B=H[1],C=H[2],D=H[3],E=H[4]
unsigned long H[5] = { 0,0,0,0,0 };
unsigned char temp_text[64];

memset(temp_text, 0x00, 64);
memset(temp_ul_text, 0x00, 80*sizeof(unsigned long));
memcpy(H, h, 5 * (sizeof(unsigned long)));
memcpy(temp_text, (n_text + i), 64);

CharToUlong(temp_text, temp_ul_text);

for (int j = 0; j < 80; j++)
{
switch ((int)j/20)
{
case 0:
k = 0x5a827999;
f = (H[1] & H[2]) | ((~H[1]) & H[3]);
break;
case 1:
k = 0x6ed9eba1;
f = H[1] ^ H[2] ^ H[3];
break;
case 2:
k = 0x8f1bbcdc;
f = (H[1] & H[2]) | (H[1] & H[3]) | (H[2] & H[3]);
break;
case 3:
k = 0xca62c1d6;
f = H[1] ^ H[2] ^ H[3];
break;
default:
break;
}
temp_A = ((H[0] << 5) | (H[0] >> 27)) + temp_ul_text[j] + k + f+H[4];
H[4] = H[3];
H[3] = H[2];
H[2] = (H[1] << 30) | (H[1] >> 2);
H[1] = H[0];
H[0] = temp_A;
}
for (int k = 0; k < 5; k++)
h[k] += H[k];
}
free(n_text);
//调试代码,输出结果
for (int o = 0; o < 5; o++)
printf("%x", h[o]);
}

inline void SHA1::CharToUlong
(
_In_ const unsigned char* char_data,
_Inout_ unsigned long* ulong_data
)
{
memset(ulong_data, 0x00, 80);
for(int i=0;i<16;i++)
ulong_data[i] = (((unsigned long*)char_data)[i]);
for (int i = 16; i < 80; i++)
{
ulong_data[i] = ulong_data[i - 16] ^ ulong_data[i - 14] ^
ulong_data[i - 8] ^ ulong_data[i - 3];
ulong_data[i] = (ulong_data[i] << 1) | (ulong_data[i] >> 31);
}
}

...全文
55 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧