SHA-1算法

一、實驗目的及要求

1. 掌握SHA-1算法的原理

2. 編寫程序實現這個算法

 

二、實驗設備(環境)及要求

   PC機, VC++等

三、實驗內容與步驟

  1. SHA-1(對代碼中的主要內容進行分析講解)

步驟:

  1. 對輸入的字符串進行補位操作,因爲Sha-1算法標準規定,必須對消息摘要進行補位操作,即將輸入的數據進行填充,使得數據長度對512求餘的結果爲448,填充比特位的最高位補一個1,其餘的位補0,如果在補位之前已經滿足對512取模餘數爲448,也要進行補位,在其後補一位1即可。
  2. 在信息摘要後面附加64bit的信息,用來表示原始信息摘要的長度;
  3. 初始化緩存:

H0=0x67452301

H1=0xefcdab89

H2=0x98badcfe

H3=0x10325476

H4=0xc3d2e1f0

  1. 計算消息摘要:循環左移操作符Sn(x),x是一個字,也就是32bit大小的變量,n是一個整數且0<=n<=32。Sn(X) = (X<<n)OR(X>>32-n),和在程序中所要用到的常量,這一系列常量字k(0)、k(1)、...k(79),以及所要用到的一系列函數。
  2. 計算需要一個緩衝區,由5個32位的字組成,還需要一個80個32位字的緩衝區。第一個5個字的緩衝區被標識爲A,B,C,D,E。80個字的緩衝區被標識爲W0, W1,..., W79;
  3. 另外還需要一個一個字的TEMP緩衝區。
  4. 將 Mi 分成 16 個字 W0, W1, ... , W15,  W0 是最左邊的字
  5. 對於 t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16).
  6. 令 A = H0, B = H1, C = H2, D = H3, E = H4.
  7. 對於 t = 0 到 79,執行下面的循環

TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;

E = D; D = C; C = S30(B); B = A; A = TEMP;

  1. 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.

代碼:


#include "stdafx.h"
#include<stdio.h>
#include <string.h>
#include <conio.h>
#include <wtypes.h>
void creat_w(unsigned char input[64],unsigned long w[80])
{
   int i,j;unsigned long temp,temp1;
   for(i=0;i<16;i++)
          {
             j=4*i;
             w[i]=((long)input[j])<<24 |((long)input[1+j])<<16|((long)input[2+j])<<8|((long)input[3+j])<<0;
 
          }
   for(i=16;i<80;i++)
         {
             w[i]=w[i-16]^w[i-14]^w[i-8]^w[i-3];
             temp=w[i]<<1;
             temp1=w[i]>>31;
             w[i]=temp|temp1;
 
         }
}
char ms_len(long a,char intput[64])
{
    unsigned long temp3,p1;  int i,j;
    temp3=0;
    p1=~(~temp3<<8);
    for(i=0;i<4;i++)
       {
          j=8*i;
          intput[63-i]=(char)((a&(p1<<j))>>j);
 
       }
	return '0';
}
int _tmain(int argc, _TCHAR* argv[])
{
   unsigned long H0=0x67452301,H1=0xefcdab89,H2=0x98badcfe,H3=0x10325476,H4=0xc3d2e1f0;
   unsigned long A,B,C,D,E,temp,temp1,temp2,temp3,k,f;int i,flag;unsigned long w[80];
   unsigned char input[64]; long x;int n;
   printf("input message:\n");
   scanf("%s",input);
   n=strlen((LPSTR)input);
   if(n<57)
          {
                 x=n*8;
                 ms_len(x,(char*)input);
                 if(n==56)
                     for(i=n;i<60;i++)
                     input[i]=0;
                 else
                    {
                     input[n]=128;
                     for(i=n+1;i<60;i++)
                     input[i]=0;
                    }
 
          }
 
   creat_w(input,w);
   /*for(i=0;i<80;i++)
   printf("%lx,",w[i]);*/
   printf("\n");
   A=H0;B=H1;C=H2;D=H3;E=H4;
   for(i=0;i<80;i++)
         {
               flag=i/20;
               switch(flag)
                  {
                   case 0: k=0x5a827999;f=(B&C)|(~B&D);break;
                   case 1: k=0x6ed9eba1;f=B^C^D;break;
                   case 2: k=0x8f1bbcdc;f=(B&C)|(B&D)|(C&D);break;
                   case 3: k=0xca62c1d6;f=B^C^D;break;
                  }
               /*printf("%lx,%lx\n",k,f); */
               temp1=A<<5;
               temp2=A>>27;
               temp3=temp1|temp2;
               temp=temp3+f+E+w[i]+k;
               E=D;
               D=C;
 
               temp1=B<<30;
               temp2=B>>2;
               C=temp1|temp2;
               B=A;
               A=temp;
 
               //printf("%lx,%lx,%lx,%lx,%lx\n",A,B,C,D,E);//輸出編碼過程
         }
   H0=H0+A;
   H1=H1+B;
   H2=H2+C;
   H3=H3+D;
   H4=H4+E;
   printf("\noutput hash value:\n");
   printf("%lx%lx%lx%lx%lx",H0,H1,H2,H3,H4);
   getch();
}

 

四、實驗結果與數據處理

 

 

五、分析與討論

  經過這次實驗,我明白了SHA-1的的特性(對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。當接收到消息的時候,這個消息摘要可以用來驗證數據的完整性。在傳輸的過程中,數據很可能會發生變化,那麼這時候就會產生不同的消息摘要)以及它的原理(遵循雪崩效應)

  經過這次實現,我明白了它與MD5算法的差別:

  (1)MD5是^128數量級的操作,而對SHA-1則是2^160數量級的操作,這樣,SHA-1對強行攻擊 有更大的強度

  (2)不過在相同的硬件上,SHA-1的運行速度比MD5慢.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章