用c语言实现sha1

for(I = 0;istrlen(消息);I)如果信息很大,这个句子可能很耗时。

其实只要int len = strlen(message) first,那么

for(I = 0;我len我)是的。只算一次。

C语言中每个字符串都包含一个【字符串终止符】吗? C语言中的每个字符串都包含一个[字符串终止符]-即“空字符”,用' \0 '表示。

sha1算法的c语言实现 如果你又知道的话,可以搜索“sha1算法”。void sha1 _ finish(sha1 _ context * CTX,uint8digest [20])函数就是你想要的。

祖冲之(zuc)密码算法算法加密C语言实现代码。 这么久没人回答,我什么都明白了。祖冲之算法分为三个算法ZUC,它是祖冲之算法的核心,只产生秘密密钥流KS。由EEA3和EIA3调用。EEA3是一种加密算法,将用户的密钥与KS绑定,对用户数据D进行加密,变成密文。相当于国际上的RSA、DES、AES算法。EIA3是一种对称加密和解密算法,是一种数据完整性算法,也是一种MAC。绑定用户的密钥,结合KS生成一个哈希值。它相当于国际通用的HMAC与MD5和SHA1的组合。用于生成和保存密码授权值。

求MD5算法用C语言实现。 #包含stdio.h

#包含stdlib.h

#包含字符串. h

#如果定义了(__APPLE__)

# define COMMON _ DIGEST _ FOR _ OPENSSL

#包含CommonCrypto/CommonDigest.h

#定义SHA1 SHA1 CC

#否则

#包含openssl/md5.h

#endif

//这是自己写的函数,用来计算MD5。

//参数str:要转换的字符串。

//参数lengthL:字符串的长度可以通过strlen(str)直接得到。

//返回值:MD5字符串

char * str 2d 5(const char * str,int length) {

int n;

MD5 _ CTX c;

无符号字符摘要[16];

char * out =(char *)malloc(33);

MD5 _ Init(c);

while(长度0) {

if(长度512) {

MD5_Update(c,str,512);

}否则{

MD5_Update(c,str,length);

}

长度-= 512;

str = 512

}

MD5_Final(digest,c);

for(n = 0;n16;n) {

snprintf((out[n*2]),16*2,“x”,(unsigned int)digest[n]);

}

退了出来;

}

int main(int argc,char **argv) {

char *output = str2md5("hello ",strlen(" hello "));

printf("%s\n ",输出);

//上面会输出hello的MD5字符串:

//5d 41402 ABC 4b 2 a 76 b 9719d 911017 c 592

免费(输出);

返回0;

}

如何用C语言获取文件的SHA1哈希值 有现成的SHA1算法函数。

复制它。

然后打开文件,读取数据,并调用SHA1函数。

#包含stdio.h

#包含stdlib.h

#包含字符串. h

#include assert.h

#包含错误号h

#undef大端主机

typedef无符号int u32

/****************

*将32位整数旋转n个字节

*/

#如果已定义(__GNUC__)已定义(__i386__)

静态内嵌u32

rol( u32 x,整数n)

{

__asm__("roll %%cl,%0 "

:" =r" (x)

:“0”(x),“c”(n));

返回x;

}

#否则

#定义rol(x,n) ( ((x) (n)) | ((x) (32-(n))))

#endif

typedef结构{

u32 h0,h1,h2,h3,H4;

u32 nblocks

无符号char buf[64];

int计数;

} SHA1 _上下文;

空的

sha1 _ init(SHA1 _上下文*高清)

{

HD-h0 = 0x 67452301;

HD-h1 = 0x efcdab 89;

HD-H2 = 0x 98 bad cfe;

HD-H3 = 0x 10325476;

HD-H4 = 0x C3 D2 e1f 0;

HD-n blocks = 0;

HD-count = 0;

}

/****************

*转换由16个32位字组成的消息X

*/

静态空隙

转换(SHA1 _上下文*高清,无符号字符*数据)

{

u32 a、b、c、d、e、TM;

u32x[16];

/*从链接变量中获取值*/

a = HD-h0;

b = HD-h1;

c = HD-H2;

d = HD-H3;

e = HD-H4;

#ifdef大端主机

memcpy( x,data,64);

#否则

{

int I;

无符号字符* p2

for(i=0,p2 =(unsigned char *)x;i 16I,p2 = 4)

{

p2[3]= *数据;

p2[2]= *数据;

p2[1]= *数据;

p2[0]= *数据;

}

}

#endif

#定义K1 0x5A827999L

#定义K2 0x6ED9EBA1L

#定义K3 0x8F1BBCDCL

#定义K4 0xCA62C1D6L

#定义F1(x,y,z) ( z ^ ( x ( y ^ z)))

#定义F2(x,y,z) ( x ^ y ^ z)

#定义F3(x,y,z) ( ( x y ) | ( z ( x | y)))

#定义F4(x,y,z) ( x ^ y ^ z)

#定义m(I)(TM = x[i0x 0f]^ x[(I-14)0x0f]\

^ x[(i-8)0x0f] ^ x[(i-3)0x0f] \

,(x[i0x0f] = rol(tm,1)))

#定义R(a,b,c,d,e,f,k,m) do { e = rol( a,5 ) \

f( b,c,d ) \

k线

m;\

b = rol( b,30);\

} while(0)

R( a,b,c,d,e,F1,K1,x[0]);

R( e,a,b,c,d,F1,K1,x[1]);

R( d,e,a,b,c,F1,K1,x[2]);

R( c,d,e,a,b,F1,K1,x[3]);

R( b,c,d,e,a,F1,K1,x[4]);

R( a,b,c,d,e,F1,K1,x[5]);

R( e,a,b,c,d,F1,K1,x[6]);

R( d,e,a,b,c,F1,K1,x[7]);

R( c,d,e,a,b,F1,K1,x[8]);

R( b,c,d,e,a,F1,K1,x[9]);

R( a,b,c,d,e,F1,K1,x[10]);

R( e,a,b,c,d,F1,K1,x[11]);

R( d,e,a,b,c,F1,K1,x[12]);

R( c,d,e,a,b,F1,K1,x[13]);

R( b,c,d,e,a,F1,K1,x[14]);

R( a,b,c,d,e,F1,K1,x[15]);

R( e,a,b,c,d,F1,K1,M(16));

R( d,e,a,b,c,F1,K1,M(17));

R( c,d,e,a,b,F1,K1,M(18));

R( b,c,d,e,a,F1,K1,M(19));

R( a,b,c,d,e,F2,K2,M(20));

R( e,a,b,c,d,F2,K2,M(21));

R( d,e,a,b,c,F2,K2,M(22));

R( c,d,e,a,b,F2,K2,M(23));

R( b,c,d,e,a,F2,K2,M(24));

R( a,b,c,d,e,F2,K2,M(25));

R( e,a,b,c,d,F2,K2,M(26));

R( d,e,a,b,c,F2,K2,M(27));

R( c,d,e,a,b,F2,K2,M(28));

R( b,c,d,e,a,F2,K2,M(29));

R( a,b,c,d,e,F2,K2,M(30));

R( e,a,b,c,d,F2,K2,M(31));

R( d,e,a,b,c,F2,K2,M(32));

R( c,d,e,a,b,F2,K2,M(33));

R( b,c,d,e,a,F2,K2,M(34));

R( a,b,c,d,e,F2,K2,M(35));

R( e,a,b,c,d,F2,K2,M(36));

R( d,e,a,b,c,F2,K2,M(37));

R( c,d,e,a,b,F2,K2,M(38));

R( b,c,d,e,a,F2,K2,M(39));

R( a,b,c,d,e,F3,K3,M(40));

R( e,a,b,c,d,F3,K3,M(41));

R( d,e,a,b,c,F3,K3,M(42));

R( c,d,e,a,b,F3,K3,M(43));

R( b,c,d,e,a,F3,K3,M(44));

R( a,b,c,d,e,F3,K3,M(45));

R( e,a,b,c,d,F3,K3,M(46));

R( d,e,a,b,c,F3,K3,M(47));

R( c,d,e,a,b,F3,K3,M(48));

R( b,c,d,e,a,F3,K3,M(49));

R( a,b,c,d,e,F3,K3,M(50));

R( e,a,b,c,d,F3,K3,M(51));

R( d,e,a,b,c,F3,K3,M(52));

R( c,d,e,a,b,F3,K3,M(53));

R( b,c,d,e,a,F3,K3,M(54));

R( a,b,c,d,e,F3,K3,M(55));

R( e,a,b,c,d,F3,K3,M(56));

R( d,e,a,b,c,F3,K3,M(57));

R( c,d,e,a,b,F3,K3,M(58));

R( b,c,d,e,a,F3,K3,M(59));

r(阿、中、英、法、东、F4、K4、米(60));

(英、阿、乙、丙、丁、F4、K4、米(61));

(民主、英、阿、乙、丙、F4、K4、米(62));

r(中、英、法、俄、西、F4、K4、米(63));

R( b、c、d、e、a、F4、K4,M(64));

r(阿、中、英、法、东、F4、K4、米(65));

(英、阿、乙、丙、丁、F4、K4、米(66));

(民主、英、阿、乙、丙、F4、K4、米(67));

r(中、英、法、俄、西、F4、K4、米(68));

R( b、c、d、e、a、F4、K4、M(69));

r(阿、中、英、法、东、F4、K4、米(70));

(英、阿、乙、丙、丁、F4、K4、米(71));

(民主、英、阿、乙、丙、F4、K4、米(72));

r(中、英、法、俄、西、F4、K4、米(73));

R( b、c、d、e、a、F4、K4、M(74));

r(阿、中、英、法、东、F4、K4、米(75));

(英、阿、乙、丙、丁、F4、K4、米(76));

(民主、英、阿、乙、丙、F4、K4、米(77));

r(中、英、法、俄、西、F4、K4、米(78));

R( b、c、d、e、a、F4、K4、M(79));

/*更新链接变量*/

HD-h0 = a;

HD-h1 = b;

HD-H2 = c;

HD-H3 = d;

HD-H4 = e;

}

/*用内容更新消息摘要

*长度为INLEN的INBUF。

*/

静态空隙

sha1 _ write(SHA1 _上下文*hd,无符号字符*inbuf,size_t inlen)

{

if( hd-count == 64 ) { /*刷新缓冲器*/

transform( hd,HD-buf);

HD-count = 0;

HD-n blocks;

}

如果(!inbuf)

返回;

if(高清计数){

for(;inlen HD-count 64;inlen -)

HD-buf[HD-count]= * in buf;

sha1_write( hd,NULL,0);

如果(!inlen)

返回;

}

while( inlen = 64 ) {

transform(高清,in buf);

HD-count = 0;

HD-n blocks;

inlen-= 64;

inbuf = 64

}

for(;inlen HD-count 64;inlen -)

HD-buf[HD-count]= * in buf;

}

/*例程final终止计算,并

*返回摘要。

*句柄为新的周期做好了准备,但是向

*句柄将销毁返回的缓冲区。

*返回:代表摘要的20个字节。

*/

静态空隙

sha1 _ final(SHA1 _ CONTEXT *高清)

{

u32 t,msb,lsb

无符号char * p;

sha1_write(hd,NULL,0);/*齐平*/;

t = HD-n blocks;

/*乘以64得出字节数*/

LSB = t 6;

msb = t 26

/*添加计数*/

t = lsb

if( (lsb = hd-count) t)

msb

/*乘以8进行位计数*/

t = lsb

LSB = 3;

msb = 3;

msb | = t 29

if( hd-count 56 ) { /*足够的空间*/

HD-buf[HD-count]= 0x 80;/* pad */

while(高清计数56)

HD-buf[HD-count]= 0;/* pad */

}

否则{ /*需要一个额外的块*/

HD-buf[HD-count]= 0x 80;/*填充字符*/

while(高清计数64)

HD-buf[HD-count]= 0;

sha1_write(hd,NULL,0);/*齐平*/;

memset(hd-buf,0,56);/*用零填充下一个块*/

}

/*追加64位计数*/

HD-buf[56]= msb 24;

HD-buf[57]= msb 16;

HD-buf[58]= msb 8;

HD-buf[59]= msb;

HD-buf[60]= LSB 24;

HD-buf[61]= LSB 16;

HD-buf[62]= LSB 8;

HD-buf[63]= LSB;

transform( hd,HD-buf);

p = HD-buf;

#ifdef大端主机

#定义X(a)do { *(u32 *)p = HD-h # # a;p = 4;} while(0)

#else /* little endian */

#定义X(a)do { * p = HD-h # # a 24;* p = HD-h # # a 16;\

* p = HD-h # # A8;* p = HD-h # # a;} while(0)

#endif

x(0);

x(1);

x(2);

x(3);

x(4);

#undef X

}

相关文章

发表新评论