OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3001|回复: 0

c-free的程序放在KEIL4中运行结果不一样

[复制链接]

10

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2016-8-5
在线时间
57 小时
发表于 2016-8-16 10:23:17 | 显示全部楼层 |阅读模式
/*
* SHA1散列算法
* <kerndev@foxmail.com>
* 参考:http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
*/
#include <stdio.h>
#include <string.h>
#include "sha1.h"

#define S(x,n)        (((x)<<n)|(x)>>(32-n))        //SHA定义S函数为循环左移

static unsigned long h[5];
static unsigned long m[16];
static unsigned long w[80];

//补位(余数=448)+补长度(64位)=512位M
static void sha1_pad(unsigned char *input, int len)
{
        int i;
        int n;

        for(i=0;i<16;i++)
        {
                m = 0;
        }

        for(i=0;i<len;i++)
        {
                n = 24-((i&0x03)<<3);
                m[i/4] |= input<<n;
        }
        n = 24-((i&0x03)<<3);
        m[i/4] |= 0x80<<n;
        m[15] = len*8;
}

//由512位M生成80字W
static void sha1_prepare(void)
{
        int i;
        for(i=0;i<16;i++)
        {
                w=m;
        }
        for(i=16;i<80;i++)
        {
                w=w[i-16]^w[i-14]^w[i-8]^w[i-3];
                w=S(w,1);
        }
}

//由80字W计算sha1
static void sha1_calc(void)
{
        int i;
        unsigned long a,b,c,d,e,f,k;
        unsigned long temp;
       
        h[0]=0x67452301;
        h[1]=0xEFCDAB89;
        h[2]=0x98BADCFE;
        h[3]=0x10325476;
        h[4]=0xC3D2E1F0;
       
        a = h[0];
        b = h[1];
        c = h[2];
        d = h[3];
        e = h[4];
        for(i=0;i<80;i++)
        {
                switch(i/20)
                {
                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;
                }
                temp=S(a,5)+f+e+w+k;
                e=d;
                d=c;
                c=S(b,30);
                b=a;
                a=temp;
        }
        h[0]+=a;
        h[1]+=b;
        h[2]+=c;
        h[3]+=d;
        h[4]+=e;
}

//SHA1算法接口
//input:待校验的数据
//len:数据长度(小于56字节)
unsigned long* sha1(void* input, int len)
{
        sha1_pad(input,len);
        sha1_prepare();
        sha1_calc();
        return h;
}
void main(void)
{
        char str[1024];
        unsigned long* mac;
        while(1)
        {
                puts("input:");
                gets(str);
                mac=sha1(str,strlen(str));
                printf("SHA1=%x%d%d%x%x\n",mac[0],mac[1],mac[2],mac[3],mac[4]);
                system("pause");
        }
}



keil中其他都一样,main调用不一样,改成下面的了
memcpy(sha1str,sha1("a",strlen("a")),50);


然后我去观察对比最后的输出结果,c-free中的mac【0】和keil中的 h【0】,结果是不一样的,然后我C-FREE调试界面的结果显示跟mac的值也是不一样的

keil

keil

c-free

c-free
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-12 14:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表