`
testcs_dn
  • 浏览: 113879 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SHA-1算法c语言实现

 
阅读更多

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。

算法实现的版本比较多,以下代码来自:http://download.csdn.net/detail/zhangrulzu/2936159,代码行数很少,但确实实现了想要的效果。

下载的SHA-1算法:

#include<stdio.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);

       }

}
main()
{
   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(input);
   if(n<57)
          {
                 x=n*8;
                 ms_len(x,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();
}

这里对算法验证过程做一个记录说明:

Visual Studio 2005,文件》新建》项目》Visual c++》Win32控制台应用程序,输入项目名称“SHA1”,完成;

把下载的代码贴到SHA1.cpp文件末尾,复制“int _tmain(int argc, _TCHAR* argv[])”,删除_tmain函数,替换“main()”;

编译代码,提示以下错误:

错误 2 error C3861: “strlen”: 找不到标识符 e:\devlop\sha1\sha1\sha1.cpp 43

错误 3 error C2664: “ms_len”: 不能将参数 2 从“unsigned char [64]”转换为“char []” e:\devlop\sha1\sha1\sha1.cpp 47

错误 4 error C3861: “getch”: 找不到标识符 e:\devlop\sha1\sha1\sha1.cpp 98

第一条是警告,可以不处理

警告 1 warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. e:\devlop\sha1\sha1\sha1.cpp 42

双击错误2,定位到错误位置,在“strlen"上单击鼠标右键》Refactor》Add Include,如下图:


如果没有这一项,那应该是没有安装VC助手的原因;

双击错误3,定位到错误位置,在变量input前加(char*)强制转换;

双击错误4,定位到错误位置,在“getch"上单击鼠标右键》Refactor》Add Include;

按F6键编译项目,发现还有错误:

错误 2 error C2664: “strlen”: 不能将参数 1 从“unsigned char [64]”转换为“const char *” e:\devlop\sha1\sha1\sha1.cpp 45

双击错误2,定位到错误位置,在input前加(LPSTR)强制转换,编译,还有错误:

错误 2 error C2065: “LPSTR”: 未声明的标识符 e:\devlop\sha1\sha1\sha1.cpp 45

错误 3 error C2146: 语法错误 : 缺少“)”(在标识符“input”的前面) e:\devlop\sha1\sha1\sha1.cpp 45

错误 4 error C2059: 语法错误 : “)” e:\devlop\sha1\sha1\sha1.cpp 45

还是找不到标识符,方法一样:在“LPSTR"上单击鼠标右键》Refactor》Add Include;

再编译,又报错:

错误 4 error C4716: “ms_len”: 必须返回一个值 e:\devlop\sha1\sha1\sha1.cpp 38

定位到错误位置,仔细看了一下,这个函数的返回值应该没什么用,随便返回一个:return '0';

再编译,OK,终于生成成功了!

F5调试,输入:abcd,回车,哦,输出了好多东东,查看代码的输出调用,

找到92行应该没用,注释://printf("%lx,%lx,%lx,%lx,%lx\n",A,B,C,D,E);//输出编码过程,

最后得到的SHA1哈希值中还有逗号,找到100行,将printf("%lx,%lx,%lx,%lx,%lx",H0,H1,H2,H3,H4);格式化字符串中的逗号去掉;

再编译,F5调试,输入:abcd,回车,结果如下图:


得到的结果对不对呢,找到一个在线SHA1加密工具,输入abcd,结果如下:


对比一下,OK,结果一至。

修改后的SHA-1算法:

// SHA1.cpp : 定义控制台应用程序的入口点。
//
#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();
}
修改后项目源码下载:http://download.csdn.net/detail/testcs_dn/7344003

分享到:
评论

相关推荐

    SHA-1_hashsha-1_sha-1_SHA-1算法的C语言实现_

    这篇实验内容主要关注SHA-1算法的C语言实现,这是一种基础但重要的技能,因为理解并实现哈希函数可以帮助学习者深入理解其工作原理。C语言由于其底层特性和效率,常被用于编写这样的核心算法。 SHA-1算法的执行过程...

    sha 算法c语言实现

    在标题“SHA算法C语言实现”中,我们关注的是如何使用C语言编写代码来实现SHA算法。C语言是一种底层、通用且高效的编程语言,适合编写这样的底层算法实现。 描述中提到“编译成功,并在nrf52832上验证”,nrf52832...

    sha-1 填充算法C语言实现

    sha-1 填充算法C语言实现版本,亲测可用

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

    本文将详细介绍SHA-1算法的原理和C语言实现,并分析给定的文件内容。 SHA-1算法由美国国家安全局设计,于1993年发布,其输出是一个160位(20字节)的哈希值。SHA-1是基于消息摘要函数MD4改进而来的,但比MD4更安全...

    用C语言实现SHA-1算法

    SHA-1(Secure Hash Algorithm 1)是一种...在压缩包中的"sha"可能是实现SHA-1算法的源代码文件,包含C语言的函数定义和实现细节。分析和阅读这些源代码可以帮助深入理解SHA-1的工作原理,并为编写自己的实现提供参考。

    Sha1算法c语言实现

    在C语言中实现SHA1算法通常包括以下几个步骤: 1. **初始化变量**:首先,需要初始化几个中间变量,它们在计算过程中存储中间结果。这些变量包括五个32位的整数,分别用A、B、C、D和E表示,初始值由SHA1规范给出。 ...

    SHA1算法及HMAC<SHA1>算法C语言实现

    /*SHA1算法及HMAC&lt;SHA1&gt;算法C语言实现。内附详细测试例程。测试数据取自rfc2202.txt和rfc3174.txt。源文件列表: md5.h, md5.cpp, test.h, test.cpp, rfc2202.txt, rfc3174.txt。包含测试工程: VC++6.0, VC++2008, ...

    SHA常用算法实现(SHA-1, SHA256, SHA384, SHA512)

    这些算法的C语言实现对于理解和研究散列函数的工作原理,以及在实际项目中应用SHA算法都具有很高的参考价值。同时,由于SHA-1的安全性已被广泛质疑,建议在新项目中优先考虑使用SHA-256或更安全的算法。

    sha.rar_SHA_SHA-1算法的 C语言实现

    在C语言中实现SHA-1算法,首先需要定义用于存储中间结果的5个32位整数变量(H0, H1, H2, H3, H4),以及一个消息缓冲区,用于存储分块处理的消息。然后,将输入消息划分为512位的数据块,每块进行处理。每个数据块...

    FIPS 180-2 散列算法SHA-224、SHA-256、SHA-384 和 SHA-512 的C语言快速软件实施

    这些算法分别产生224、256、384和512位的散列值,它们比SHA-1更加强壮,因为它们对抵抗碰撞攻击有更高的安全性。 SHA-224:输出224位散列值,通常用于需要较短散列值但又希望比SHA-1更安全的场景。 SHA-256:输出...

    SHA256 哈希密码算法C语言实现

    压缩包中的文件"SHA256"可能包含了C语言实现的SHA256算法的源代码文件,可能还包括编译脚本、测试用例和文档等。要使用这个实现,你需要将其解压并编译源代码,然后在你的程序中调用生成的库或可执行文件,将待哈希...

    SHA-1算法c语言

    hash函数的sha-1算法。使用C语言编程。

    SHA-224/SHA-256/SHA-384/SHA-512摘要算法-C语言

    C语言实现SHA-224/SHA-256/SHA-384/SHA-512摘要算法。编译环境:VS2010。请参考我的博客: SHA-224:https://blog.csdn.net/u013073067/article/details/86605223 SHA-256:...

    用C++实现SHA-2算法家族

    在C++中实现SHA-2算法家族,首先需要理解这些算法的基本工作原理。SHA-2算法的核心是基于消息区块和一系列的位操作(如旋转、异或等)进行的。算法流程大致如下: 1. **前处理**:输入的消息被填充到固定长度,加上...

    SHA-256算法的C++实现及demo

    1. **初始化哈希值**:SHA-256算法开始时会使用一组固定的初始化向量,这些向量是64位整数数组。 2. **分块处理**:输入数据被分成512位的数据块进行处理。每个数据块首先会被填充到512位,并附加一个表示原始输入...

    sha-1密码算法C语言实现

    在本案例中,我们关注的是SHA-1算法的C语言实现,这在很多系统和应用程序中都有应用,如验证文件完整性、数字签名等。 SHA-1算法的基本流程包括初始化、处理消息块以及生成摘要。首先,算法会用一组固定的初始值...

    Hmac算法c语言实现

    在C语言中,你可以使用开源库如OpenSSL提供的`EVP_DigestInit`, `EVP_DigestUpdate`和`EVP_DigestFinal`系列函数来实现SHA-1、SHA-256等哈希函数。 2. **预处理密钥**:HMAC算法要求密钥首先进行处理,以便适应所选...

    Sha256算法c语言实现

    在压缩包中的`Sha256`文件很可能是实现了SHA-256算法的C语言源代码,包含上述步骤的详细实现。通过阅读和理解这段代码,可以深入了解SHA-256的工作原理,并学习如何在实际项目中应用这种强大的安全工具。

    SHA1加密算法(c语言实现).zip

    这个压缩包文件"SHA1加密算法(c语言实现).zip"显然包含了用C语言编写的SHA1算法实现。C语言是一种底层、高效且通用的编程语言,非常适合实现这样的底层算法。 SHA1全称为Secure Hash Algorithm 1,是美国国家安全局...

Global site tag (gtag.js) - Google Analytics