⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash_sha1.c

📁 在MCS51单片机上实现SHA1算法,可以产生20个字节的数字摘要
💻 C
字号:
#include <config.h>


uint8 sha1_buf[ SHA1_BUFLEN ];

uint32 H[5];

uint32 Sn(uint32 u32t ,uint8 n)
{
	uint32 t0,t1;
	t0 = u32t ;
	t1 = u32t;
    u32t = (t0 << n)|(t1 >> (32 - n)) ;
	return 	 u32t;
}

    void sha1_compress(uint8 *buf) 

{
    uint32 a,b,c,d,e,W[80],i;
    uint32 t,te;
//    uint8 *p;
    /* copy the state into 512-bits into W[0..15] */
    for (i = 0; i < 16; i++) {
        memcpy( (void*)&W[i], buf + (4*i)  ,4);
    }

/*		ds_send_byte(0x6b);
		ds_send_byte(0x6b);
		ds_send_byte(0x6b);
		ds_send_byte(0x6b);

	 p = (void*)W;
	 for(i = 0; i< 64 ;i++)
   {
 	   ds_send_byte(p[i]);
   }
      ds_send_byte(0x66);
		ds_send_byte(0x66);
		ds_send_byte(0x66);
		ds_send_byte(0x66);
 */

   
    /* copy state */
   a = H[0];
   
    b = H[1];
  
    c = H[2];
  
    d = H[3];
  
    e = H[4];
    
    /* expand it */
 
    for (i = 16; i < 80; i++) {
        //W[i] = ROL(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1); 
         W[i] = Sn(( W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16]),1) ;
    } 
 //    ds_send_byte(0xa6);	


	
    for (i = 0; i < 20; ) {
      // FF0(a,b,c,d,e,i++); 
	  // t = e; e = d; d = c; c = b; b = a; a = t;
	   
	   te = (b & c) ^ ((0xffffffff ^ b) & d);
	   
	   t = (Sn(a,5) + te + e + W[i] + 0x5a827999);
	  
	   b =Sn(b,30);
	   e = d; d = c; c = b; b = a; a = t;
 	   i++;
       }
 /*     
	   p = (void*)&a;
	   for(i = 0; i<4; i++)
	   {   	   
		  ds_send_byte(*p++);
	   }
	
       ds_send_byte(0x61);
	   i = 20 ;
*/	 
  for (; i < 40; ) {
      // FF1(a,b,c,d,e,i++);
	   // t = e; e = d; d = c; c = b; b = a; a = t;
	   te = b ^ c ^ d;
	   t = (Sn(a,5) + te + e + W[i] + 0x6ed9eba1);
	   b =Sn(b,30);
	   e = d; d = c; c = b; b = a; a = t;
	   i++;
    }
/*	   p = (void*)&a;
	   for(i = 0; i<4; i++)
	   {   	   
		  ds_send_byte(*p++);
	   }
	
      ds_send_byte(0x62);
	  while(1);
*/
    for (; i < 60; ) {
      // FF2(a,b,c,d,e,i++); 
	   //t = e; e = d; d = c; c = b; b = a; a = t;
	   //#define F2(x,y,z)  ((x & y) | (x & z) | (y & z)) 
	   te = (b & c) ^(b & d) ^ (c & d);
	   t = (Sn(a,5) + te + e + W[i] + 0x8f1bbcdc);
	   b =Sn(b,30);
	   e = d; d = c; c = b; b = a; a = t;
	    i++;
    }
/*	    p = (void*)&a;
	   for(i = 0; i<4; i++)
	   {   	   
		  ds_send_byte(*p++);
	   }
	
    
	  while(1);
     ds_send_byte(0x63);
*/
    for (; i < 80; ) {
      // FF3(a,b,c,d,e,i++); 
	  // t = e; e = d; d = c; c = b; b = a; a = t;
	   te = b ^ c ^ d;
	   t = (Sn(a,5) + te + e + W[i] + 0xca62c1d6);
	   b =Sn(b,30);
	   e = d; d = c; c = b; b = a; a = t;
	    i++;
    }
   
   /* store */
    H[0] = H[0] + a;
    H[1] = H[1] + b;
    H[2] = H[2] + c;
    H[3] = H[3] + d;
    H[4] = H[4] + e;
    
 /*   
     ds_send_byte(0x66);
		ds_send_byte(0x66);
		ds_send_byte(0x66);
		ds_send_byte(0x66);
	p = (void*)H;
	for (i= 0; i < 20; i++)
	{
	  	ds_send_byte(p[i]);
	
	}
 		ds_send_byte(0x99);
		ds_send_byte(0x99);
		ds_send_byte(0x99);
		ds_send_byte(0x99);
   */
}

uint8 sha1_done(uint8 *md ,uint8 *pd, uint16 len)
{
 //   uint16 i;
	uint8 *DataPtr;
	uint16 DataLen;
	uint8  q;  // 商
	uint8  r;  // 余数

	DataPtr = pd ;
	DataLen = len;

	q = len / 64;
	r = len % 64;
	
	memcpy(sha1_buf , md , len); //copy data to inner buf;
 
    sha1_buf[DataLen++] = 0x80;  //append the '1' bit
	DataPtr += DataLen ;         //append the '1' bit,use one char
		
	if( r < 56)
		{
		
			while( DataLen < (56 + q * 64))
			{
				*DataPtr++ = 0x00;
				//ds_send_byte(*(DataPtr - 1));
			    DataLen++;
			}                              // fill zero
			*(uint32 *)DataPtr = (uint32)0 ;           // fill length
			*(uint32 *)(DataPtr + 4) = (uint32)(len * 8) ;
/*	  for(	i = 0; i< (q + 1)*64 ;i++)
	   {
		  ds_send_byte( sha1_buf[i]);
		  }

*/			return 1 + q ;
			}
	if( r > 56 )
		{
			
			while( DataLen < (112 + q * 64))
			{
				*DataPtr++ = 0;
			}                              // fill zero
	        *(uint32 *)DataPtr = (uint32)0 ;           // fill length
			*(uint32 *)(DataPtr + 4) = (uint32)(len * 8) ;
			 return 2 + q;
		}
	  
}

     uint8 generater_compress(uint8 *md ,uint8 *pd ,uint16 Dlen) // pd = process data address
{
	uint16 i;
	uint8 sect;
	uint16 datalen;
	

//	uint8 *p;   //test for printer
    datalen = Dlen;
//	ds_send_byte(Dlen / 256);
//	ds_send_byte(Dlen %256);
	
	sect = sha1_done( md,pd,Dlen);
// 	ds_send_byte( sect);
/*
 for(i = 0; i< sect * 64;i++)
{
 	ds_send_byte(sha1_buf[i]);
}
    	ds_send_byte(0x55);
		ds_send_byte(0x55);
		ds_send_byte(0x55);
		ds_send_byte(0x55);
*/	
   //initialize H[];  
    H[0] = 0x67452301;
    H[1] = 0xefcdab89;
    H[2] = 0x98badcfe;
    H[3] = 0x10325476;
    H[4] = 0xc3d2e1f0;
   
	for(i = 0;i < sect ; i++)
	{
		sha1_compress( sha1_buf + i*64);
	    memcpy(sha1_buf, H, 20);
	}
	 memcpy((pd + i * 20), H, 20);
/*	
	p = (void*)H;
	for (i= 0; i < 20; i++)
	{
	  	ds_send_byte(p[i]);
	
	}
 		ds_send_byte(0x99);
		ds_send_byte(0x99);
		ds_send_byte(0x99);
		ds_send_byte(0x99);
*/	
	return sect;
}


void clear_sha1_buf(void)
{
   memset(sha1_buf, 0 ,SHA1_BUFLEN);
 }
/*
uint8 gen_compress_len(uint16 datalen)
{
	uint16 r ,q;
	r = datalen / 64;
	q = datalen % 64;
	if (q < 56) return r + 1;
	if (q > 56) return r + 2;
}

 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -