/*
* FIPS-180-1 compliant SHA-1 implementation
*/
#include <string.h>
#include "sha1.h"
void PUT_UINT32(uint32 *n,uint8 *b,uint8 i)
{
b[(i) ] = (uint8) ( (*n) >> 24 );
b[(i) + 1] = (uint8) ( (*n) >> 16 );
b[(i) + 2] = (uint8) ( (*n) >> 8 );
b[(i) + 3] = (uint8) ( (*n) );
}
uint32 R(uint8 t,uint32 *W)
{ uint32 temp;
temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ W[(t - 14) & 0x0F] ^ W[ t & 0x0F];
W[t & 0x0F] = ((temp << 1) | ((temp & 0xFFFFFFFF) >> 31));
return W[t & 0x0F];
}
void P1(uint32 a,uint32 *b,uint32 c,uint32 d,uint32 *e,uint32 x)
{
*e += ((a << 5) | ((a & 0xFFFFFFFF) >> 27)) + (d ^ (*b & (c ^ d))) + 0x5A827999 + x;
*b = ((*b << 30) | ((*b & 0xFFFFFFFF) >> 2));
}
void P2(uint32 a,uint32 *b,uint32 c,uint32 d,uint32 *e,uint32 x)
{
*e += ((a << 5) | ((a & 0xFFFFFFFF) >> 27)) + (*b ^ c ^ d) + 0x6ED9EBA1 + x;
*b = ((*b << 30) | ((*b & 0xFFFFFFFF) >> 2));
}
void P3(uint32 a,uint32 *b,uint32 c,uint32 d,uint32 *e,uint32 x)
{
*e += ((a << 5) | ((a & 0xFFFFFFFF) >> 27)) + ((*b & c) | (d & (*b | c))) + 0x8F1BBCDC + x;
*b = ((*b << 30) | ((*b & 0xFFFFFFFF) >> 2));
}
void P4(uint32 a,uint32 *b,uint32 c,uint32 d,uint32 *e,uint32 x)
{
*e += ((a << 5) | ((a & 0xFFFFFFFF) >> 27)) + (*b ^ c ^ d) + 0xCA62C1D6 + x;
*b = ((*b << 30) | ((*b & 0xFFFFFFFF) >> 2));
}
void sha1_starts( sha1_context *ctx )
{
ctx->total[0] = 0;
ctx->total[1] = 0;
ctx->state[0] = 0x67452301;
ctx->state[1] = 0xEFCDAB89;
ctx->state[2] = 0x98BADCFE;
ctx->state[3] = 0x10325476;
ctx->state[4] = 0xC3D2E1F0;
}
void sha1_process( sha1_context *ctx, uint8 Data[64])
{
uint32 W[16], A, B, C, D, E;
memcpy(W,Data,64);
A = ctx->state[0];
B = ctx->state[1];
C = ctx->state[2];
D = ctx->state[3];
E = ctx->state[4];
P1( A, &B, C, D, &E, W[0] );
P1( E, &A, B, C, &D, W[1] );
P1( D, &E, A, B, &C, W[2] );
P1( C, &D, E, A, &B, W[3] );
P1( B, &C, D, E, &A, W[4] );
P1( A, &B, C, D, &E, W[5] );
P1( E, &A, B, C, &D, W[6] );
P1( D, &E, A, B, &C, W[7] );
P1( C, &D, E, A, &B, W[8] );
P1( B, &C, D, E, &A, W[9] );
P1( A, &B, C, D, &E, W[10] );
P1( E, &A, B, C, &D, W[11] );
P1( D, &E, A, B, &C, W[12] );
P1( C, &D, E, A, &B, W[13] );
P1( B, &C, D, E, &A, W[14] );
P1( A, &B, C, D, &E, W[15] );
P1( E, &A, B, C, &D, R(16,W) );
P1( D, &E, A, B, &C, R(17,W) );
P1( C, &D, E, A, &B, R(18,W) );
P1( B, &C, D, E, &A, R(19,W) );
P2( A, &B, C, D, &E, R(20,W) );
P2( E, &A, B, C, &D, R(21,W) );
P2( D, &E, A, B, &C, R(22,W) );
P2( C, &D, E, A, &B, R(23,W) );
P2( B, &C, D, E, &A, R(24,W) );
P2( A, &B, C, D, &E, R(25,W) );
P2( E, &A, B, C, &D, R(26,W) );
P2( D, &E, A, B, &C, R(27,W) );
P2( C, &D, E, A, &B, R(28,W) );
P2( B, &C, D, E, &A, R(29,W) );
P2( A, &B, C, D, &E, R(30,W) );
P2( E, &A, B, C, &D, R(31,W) );
P2( D, &E, A, B, &C, R(32,W) );
P2( C, &D, E, A, &B, R(33,W) );
P2( B, &C, D, E, &A, R(34,W) );
P2( A, &B, C, D, &E, R(35,W) );
P2( E, &A, B, C, &D, R(36,W) );
P2( D, &E, A, B, &C, R(37,W) );
P2( C, &D, E, A, &B, R(38,W) );
P2( B, &C, D, E, &A, R(39,W) );
P3( A, &B, C, D, &E, R(40,W) );
P3( E, &A, B, C, &D, R(41,W) );
P3( D, &E, A, B, &C, R(42,W) );
P3( C, &D, E, A, &B, R(43,W) );
P3( B, &C, D, E, &A, R(44,W) );
P3( A, &B, C, D, &E, R(45,W) );
P3( E, &A, B, C, &D, R(46,W) );
P3( D, &E, A, B, &C, R(47,W) );
P3( C, &D, E, A, &B, R(48,W) );
P3( B, &C, D, E, &A, R(49,W) );
P3( A, &B, C, D, &E, R(50,W) );
P3( E, &A, B, C, &D, R(51,W) );
P3( D, &E, A, B, &C, R(52,W) );
P3( C, &D, E, A, &B, R(53,W) );
P3( B, &C, D, E, &A, R(54,W) );
P3( A, &B, C, D, &E, R(55,W) );
P3( E, &A, B, C, &D, R(56,W) );
P3( D, &E, A, B, &C, R(57,W) );
P3( C, &D, E, A, &B, R(58,W) );
P3( B, &C, D, E, &A, R(59,W) );
P4( A, &B, C, D, &E, R(60,W) );
P4( E, &A, B, C, &D, R(61,W) );
P4( D, &E, A, B, &C, R(62,W) );
P4( C, &D, E, A, &B, R(63,W) );
P4( B, &C, D, E, &A, R(64,W) );
P4( A, &B, C, D, &E, R(65,W) );
P4( E, &A, B, C, &D, R(66,W) );
P4( D, &E, A, B, &C, R(67,W) );
P4( C, &D, E, A, &B, R(68,W) );
P4( B, &C, D, E, &A, R(69,W) );
P4( A, &B, C, D, &E, R(70,W) );
P4( E, &A, B, C, &D, R(71,W) );
P4( D, &E, A, B, &C, R(72,W) );
P4( C, &D, E, A, &B, R(73,W) );
P4( B, &C, D, E, &A, R(74,W) );
P4( A, &B, C, D, &E, R(75,W) );
P4( E, &A, B, C, &D, R(76,W) );
P4( D, &E, A, B, &C, R(77,W) );
P4( C, &D, E, A, &B, R(78,W) );
P4( B, &C, D, E, &A, R(79,W) );
ctx->state[0] += A;
ctx->state[1] += B;
ctx->state[2] += C;
ctx->state[3] += D;
ctx->state[4] += E;
}
void sha1_update( sha1_context *ctx, uint8 *input, uint32 length )
{
uint32 left, fill;
if( ! length ) return;
left = ctx->total[0] & 0x3F;
fill = 64 - left;
ctx->total[0] += length;
ctx->total[0] &= 0xFFFFFFFF;
if( ctx->total[0] < length )
ctx->total[1]++;
if( left && length >= fill )
{
memcpy( (void *) (ctx->buffer + left),
(void *) input, fill );
sha1_process( ctx, ctx->buffer );
length -= fill;
input += fill;
left = 0;
}
while( length >= 64 )
{
sha1_process( ctx, input );
length -= 64;
input += 64;
}
if( length )
{
memcpy( (void *) (ctx->buffer + left),
(void *) input, length );
}
}
static uint8 sha1_padding[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
void sha1_finish( sha1_context *ctx, uint8 digest[20] )
{
uint32 last, padn;
uint32 high, low;
uint8 msglen[8];
uint8 temp[4];
uint8 i;
high = ( ctx->total[0] >> 29 )
| ( ctx->total[1] << 3 );
low = ( ctx->total[0] << 3 );
PUT_UINT32( &high, msglen, 0 );
//memcpy(&high,msglen,4);
PUT_UINT32( &low, msglen, 4 );
//memcpy(&low,msglen+4,4);
last = ctx->total[0] & 0x3F;
padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
sha1_update( ctx, sha1_padding, padn );
sha1_update( ctx, msglen, 8 );
memcpy(digest,ctx->state,20);
}
没有合适的资源?快使用搜索试试~ 我知道了~
SHA-1的一种软件实现
共3个文件
c:2个
h:1个
需积分: 22 10 下载量 115 浏览量
2008-10-21
09:25:36
上传
评论
收藏 2KB RAR 举报
温馨提示
SHA-1软件实现,希望对大家有所帮助。 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院 (NIST) 发布的一系列密码散列函数。正式名称为 SHA 的家族第一个成员发布于 1993年。然而现在的人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了。另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)。
资源推荐
资源详情
资源评论
收起资源包目录
sha-1.rar (3个子文件)
sha1.c 7KB
sha1.h 445B
main.c 614B
共 3 条
- 1
资源评论
legulas66
- 粉丝: 11
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功