#ifndef _SHA1_H #define _SHA1_H #include<iostream> using namespace std; //4個函數 #define f1(B,C,D) ((B&C)|((~B)&D)) #define f2(B,C,D) (B^C^D) #define f3(B,C,D) ((B&C)|(B&D)|(C&D)) #define f4(B,C,D) (B^C^D) typedef unsigned int UInt32; //信息摘要結構體 struct Message_Digest{ UInt32 H[5]; }; //SHA-1類 class SHA1 { public: SHA1(){INIT();}; ~SHA1(){}; Message_Digest DEAL(UInt32 W[16]);//以512bit塊為單位處理 private: void INIT(); //初始雜湊值 UInt32 ROTL(int k,UInt32 W);//循環左移k比特給定的32比特字 //信息摘要 Message_Digest MD; }; #endif
SHA-1.cpp
#include"SHA-1.h" // const UInt32 K[4] = {0x5A827999,0x6ED9EBA1,0x8F1BBCDC,0xCA62C1D6}; //初始化 void SHA1::INIT(){ MD.H[0] = 0x67452301; MD.H[1] = 0xefcdab89; MD.H[2] = 0x98badcfe; MD.H[3] = 0x10325476; MD.H[4] = 0xc3d2e1f0; } // Message_Digest SHA1::DEAL(UInt32 M[16]){ int i; UInt32 temp; UInt32 W[80]; UInt32 A,B,C,D,E; INIT();//每次都初始化 for(i=0;i<16;i++){ W[i] = M[i]; } for(i=16;i<80;i++){ W[i] = ROTL(1,(W[i-3]^W[i-8]^W[i-14]^W[i-16])); } //初始寄存器 A = MD.H[0]; B = MD.H[1]; C = MD.H[2]; D = MD.H[3]; E = MD.H[4]; cout<<"初始:"<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl; for(i=0;i<20;i++){ temp = ROTL(5,A) + f1(B,C,D) + E + W[i] + K[0]; temp &= 0xFFFFFFFF; E = D; D = C; C = ROTL(30,B); B = A; A = temp; cout<<dec<<i<<":"; cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl; } for(i=20;i<40;i++){ temp = ROTL(5,A) + f2(B,C,D) + E + W[i] + K[1]; temp &= 0xFFFFFFFF; E = D; D = C; C = ROTL(30,B); B = A; A = temp; cout<<dec<<i<<":"; cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl; } for(i=40;i<60;i++){ temp = ROTL(5,A) + f3(B,C,D) + E + W[i] + K[2]; temp &= 0xFFFFFFFF; E = D; D = C; C = ROTL(30,B); B = A; A = temp; cout<<dec<<i<<":"; cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl; } for(i=60;i<80;i++){ temp = ROTL(5,A) + f4(B,C,D) + E + W[i] + K[3]; temp &= 0xFFFFFFFF; E = D; D = C; C = ROTL(30,B); B = A; A = temp; cout<<dec<<i<<":"; cout<<hex<<A<<" "<<B<<" "<<C<<" "<<D<<" "<<E<<endl; } MD.H[0] = (MD.H[0]+A) & 0xFFFFFFFF; MD.H[1] = (MD.H[1]+B) & 0xFFFFFFFF; MD.H[2] = (MD.H[2]+C) & 0xFFFFFFFF; MD.H[3] = (MD.H[3]+D) & 0xFFFFFFFF; MD.H[4] = (MD.H[4]+E) & 0xFFFFFFFF; return MD; } //循環左移 UInt32 SHA1::ROTL(int k,UInt32 W){ return ((W << k) & 0xFFFFFFFF) | (W) >> (32-(k)); }
TEST.cpp
#include<iostream> #include"SHA-1.h" using namespace std; // typedef unsigned int UInt32; typedef unsigned __int64 UInt64; typedef unsigned char UChar; #define Max 1000//最大字符數 SHA1 sha1=SHA1(); Message_Digest M_D; UInt32 W[Max/4];//整型 UInt32 M[16]; //存分組信息 //壓縮+顯示 void compress(){ M_D = sha1.DEAL(W); cout<<"哈希值: "; cout<<hex<<M_D.H[0]<<" "; cout<<hex<<M_D.H[1]<<" "; cout<<hex<<M_D.H[2]<<" "; cout<<hex<<M_D.H[3]<<" "; cout<<hex<<M_D.H[4]; cout<<endl; } //添加填充位+添加長度 void PAD(UChar Y[Max]){ //x+1+d+l=|x| UInt32 i,j; UInt32 T1=0,T2=0,T3=0,T4=0; UChar temp[Max]={0}; UInt64 x = strlen((char *)Y);//數據長度 UInt32 d = abs(55-x) % 64; //填充長度 UInt32 n = (x+8)/64+1; //分組數 UInt32 m = x%64; //最後組數據長度 UInt32 l = 8; cout<<"數據長度x:"<<int(x)<<" "; cout<<"填充長度d:"<<d<<" "; cout<<"分組數量n:"<<n<<" "; cout<<"最後長度m:"<<m<<endl; //不填充 for(i=0;i<x;i++){ temp[i] = Y[i]; } //填充1次1000 0000 temp[x] = 0x80; //填充d次0000 0000 for(i=x+1;i<x+d+1;i++){ temp[i] = 0x00; } //填充長度的63-0位 for(i=1;i<=l;i++){ temp[(n*64)-i] = (UChar)(8*x>>(i-1)*8); } //無符號字符轉換為無符號整型 for(i=0;i<Max/4;i++){ for(j=0;j<4;j++){ if(j==0) T1 = temp[4*i+j]; if(j==1) T2 = temp[4*i+j]; if(j==2) T3 = temp[4*i+j]; if(j==3) T4 = temp[4*i+j]; } W[i] = (T1<<24) + (T2<<16) + (T3<<8) +T4; } //顯示16進制數據 cout<<"16進制數據:"; for(i=0;i<n*16;i++){ cout<<hex<<" "<<W[i]; } cout<<endl; //分組處理 for(i=0;i<n;i++){ cout<<"分組處理:"<<i+1<<endl; for(j=0;j<16;j++){ M[j] = W[(i*16)+j]; } compress();//sha-1壓縮 } } //主函數 int main(){ UChar Y[Max]; cout<<"請輸入要加密的字符串(最大"<<Max<<"個):"<<endl; cin>>Y; PAD(Y); system("pause"); return 0; }