SHA-1密码哈希算法(c语言实现)

SHA-1密码哈希算法(c语言实现)


本人为在校大学生,所写代码有诸多不足,希望各位多多指正。编译器为Dev
C++

using namespace std;
//明文
char M[100000]="abcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyzabcdefghigklmnopqrszuvwxyz"; 
//五个寄存器
unsigned int A,B,C,D,E;
//明文分组及其拓展 
unsigned int X[80];
//初始值
unsigned int IV[5]={0x67452301,0xefcdab89,0x98badcfb,0x10325476,0xc3d2e1f0}; 
//压缩函数所需常数K
unsigned int K[4]={0x5a827999,0x6ed93ba1,0x8f1bbcdc,0xca62c1d6};
//移位函数
 int move(int i,unsigned int x)
 {
 	unsigned int y;
 	y=x<<i;
 	x=y|x>>(32-i);
 	return x;
 }  
 //四轮压缩函数 
 int F1(int i)
 {
 	unsigned int m;
 	m=A;
 	A=K[0]+X[i]+move(5,A)+E+((B&C)|(~B&D));
 	E=D;
 	D=C;
 	C=move(30,B);
 	B=m;
 }
 int F2(int i)
 {
 	unsigned int m;
 	m=A;
 	A=K[1]+X[i]+move(5,A)+E+(B^C^D);
 	E=D;
 	D=C;
 	C=move(30,B);
 	B=m;
 }
 int F3(int i)
 {
 	unsigned int m;
 	m=A;
 	A=K[2]+X[i]+move(5,A)+E+((B&C)|(B&D)|(C&D));
 	E=D;
 	D=C;
 	C=move(30,B);
 	B=m;
 }
 int F4(int i)
 {
 	unsigned int m;
 	m=A;
 	A=K[3]+X[i]+move(5,A)+E+(B^C^D);
 	E=D;
 	D=C;
 	C=move(30,B);
 	B=m;
 }
 //将字符串转为可处理的32bit字,32bit为四字节由四个字符组成,每个消息分组消耗4*16=64个字符 
int code(int n,int k=16)
{
	for(int i=0;i<k;i++)
	{
		X[i]=M[4*i+64*n]|(M[4*i+1+64*n]<<8)|(M[4*i+2+64*n]<<16)|(M[4*i+3+64*n]<<24);
	}
	for(int j=0;j<16;j++)printf("%08x",X[j]);
	return 0;
}
//加密主体函数 
int enSHA1()
{
		IV[0]=A;
		IV[1]=B;
		IV[2]=C;
		IV[3]=D; 
		IV[4]=E;
		int j=1;
		for(j;j<=20;j++)F1(j);
		for(j;j<=40;j++)F2(j);
		for(j;j<=60;j++)F3(j);
		for(j;j<=80;j++)F4(j);
		A=IV[0]+A;
		B=IV[1]+B;
		C=IV[2]+C;
		D=IV[3]+D;
		E=IV[4]+E;
		return 0;
} 
//从16个字扩展到80个字 
int extendsion()
{
	for(int i=16;i<=80;i++)
	{
		X[i]=move(1,X[i-16]^X[i-14]^X[i-8]^X[i-3]);
	}
	return 0;
}
int extendsion1(unsigned long len,unsigned long n)
{	

	int x=len%64;
	int y=x/4;
	int z=x%4;
	code(n-1,y);
	if(z==1)X[y]=M[64*(n-1)+4*y+1]<<24|0x800000;
	if(z==2)X[y]=M[64*(n-1)+4*y+1]<<24| M[64*(n-1)+4*y+2]<<16|0x8000;
	if(z==3)X[y]=M[64*(n-1)+4*y+1]<<24|M[64*(n-1)+4*y+2]<<16|M[64*(n-1)+4*y+3]<<8|0x80;
	if(z==0)X[y]=0x80000000;
	for(int i=y+1;i<14;i++)X[i]=0x0;
	X[14]=(len>>31)>>1;//大端存储数据位数 
	X[15]=len;
	for(int j=0;j<16;j++)printf("%08x",X[j]);
	return 0;
}
int extendsion2(unsigned long len,unsigned long n)
{
	int x=len%64;
	int y=x/4;
	int z=x%4;
	code(n-1,y);
	if(z==1)X[y]=M[64*(n-1)+4*y+1]<<24|0x800000;
	if(z==2)X[y]=M[64*(n-1)+4*y+1]<<24| M[64*(n-1)+4*y+2]<<16|0x8000;
	if(z==3)X[y]=M[64*(n-1)+4*y+1]<<24|M[64*(n-1)+4*y+2]<<16|M[64*(n-1)+4*y+3]<<8|0x80;
	if(z==0)X[y]=0x80000000;
	for(int i=y+1;i<16;i++)X[i]=0x0;
	for(int j=0;j<16;j++)printf("%08x",X[j]);
	extendsion();
	enSHA1();
	for(int i=0;i<14;i++)X[i]=0x0;
	X[14]=(len>>31)>>1;
	X[15]=len;
	for(int j=0;j<16;j++)printf("%08x",X[j]);
	return 0;
}
int main()
{
	unsigned long len=strlen(M);
	unsigned long lbit=8*len;
	int a=((lbit%512)<448)?1:0;
	unsigned long n=(a==1)?(lbit/512+1):(lbit/512+2);
	if(a==1)
	{
		for(int i=0;i<n-1;i++)
		{
			code(i);
			extendsion();
			enSHA1();
		}
		extendsion1(len,n);
		extendsion();
		enSHA1();
	}
	else
	{
		for(int i=0;i<n-2;i++)
		{
			code(i);
			extendsion();
			enSHA1();
		}
		extendsion2(len,n);
		extendsion();
		enSHA1();
	}
	cout<<endl;
	printf("%08x%08x%08x%08x%08x",A,B,C,D,E);
	
	return 0;
}

 
发布了5 篇原创文章 · 获赞 2 · 访问量 145

猜你喜欢

转载自blog.csdn.net/m0_46583304/article/details/105327877