📄 sha加密算法.txt
字号:
SHA加密算法是目前广为应用的重要加密方法之一。而SHA-1 生成 160 位的消息摘要,虽然执行更慢,却被认为更安全。明文消息的最大长度可达到 264 位。下面是网络上流传的SHA算法,我们自己调试了一下,已经通过。现把主函数和算法函数贴出来。
/********************** 主函数*****************/
#include "mbshaee.h"
#include "stdio.h"
void main()
{
unsigned MT[64]={0x00};
unsigned *pMT;
int i = 0 ;
long A = 0x00000000,B = 0x00000000,C = 0x00000000,D = 0x00000000,E = 0x00000000;
long *pA,*pB,*pC,*pD,*pE;
pA=&A;pB=&B,pC=&C,pD=&D,pE=&E;
pMT = MT;
/***** 设定输入值MT *******/
MT[0] = 0x00 ;
printf("0x%0x\n",MT[0]);
for( i = 0 ; i<63 ; i++ )
{
MT[i+1] = MT[i] + 0x01 ;
printf("0x%0x\n",MT[i+1]);
}
ComputeSHA(pMT,pA,pB,pC,pD,pE);
printf("0x%0x\n",A);
printf("0x%0x\n",B);
printf("0x%0x\n",C);
printf("0x%0x\n",D);
printf("0x%0x\n",E);
}
/********************* mbshaee.h *****************/
#define SIZE_SHAEE 32
void ComputeSHA(unsigned int *MT,long *A,long *B, long *C, long *D,long *E);
long KTN (int n);
long NLF (long B, long C, long D, int n);
/********************* mbshaee.h *****************/
#include "mbshaee.h"
/*%%%%%%%%void setChallenge(uchar *new_challenge)
{
int i;
for(i=0;i<8;i++)
challenge[i] = new_challenge[i];
}
*/
//----------------------------------------------------------------------
// Compute the 160-bit MAC
//
// 'MT' - input data
// 'A' - part of the 160 bits
// 'B' - part of the 160 bits
// 'C' - part of the 160 bits
// 'D' - part of the 160 bits
// 'E' - part of the 160 bits
//
//
void ComputeSHA(unsigned int *MT,long *A,long *B, long *C, long *D,long *E)
{
unsigned long MTword[80];
int i;
long ShftTmp;
long Temp;
for(i=0;i<16;i++)
MTword[i] = (MT[i*4] << 24) | (MT[i*4+1] << 16) |
(MT[i*4+2] << 8) | MT[i*4+3];
for(i=16;i<80;i++)
{
ShftTmp = MTword[i-3] ^ MTword[i-8] ^ MTword[i-14] ^ MTword[i-16];
MTword[i] = ((ShftTmp << 1) & 0xfffffffe) |
((ShftTmp >> 31) & 0x00000001);
}
*A=0x67452301;
*B=0xefcdab89;
*C=0x98badcfe;
*D=0x10325476;
*E=0xc3d2e1f0;
for(i=0;i<80;i++)
{
ShftTmp = ((*A << 5) & 0xffffffe0) | ((*A >> 27) & 0x0000001f);
Temp = NLF(*B,*C,*D,i) + *E + KTN(i) + MTword[i] + ShftTmp;
*E = *D;
*D = *C;
*C = ((*B << 30) & 0xc0000000) | ((*B >> 2) & 0x3fffffff);
*B = *A;
*A = Temp;
}
}
// calculation used for the MAC
long KTN (int n)
{
if(n<20)
return 0x5a827999;
else if (n<40)
return 0x6ed9eba1;
else if (n<60)
return 0x8f1bbcdc;
else
return 0xca62c1d6;
}
// calculation used for the MAC
long NLF (long B, long C, long D, int n)
{
if(n<20)
return ((B&C)|((~B)&D));
else if(n<40)
return (B^C^D);
else if(n<60)
return ((B&C)|(B&D)|(C&D));
else
return (B^C^D);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -