C SHA_256函数破坏内存空间

C SHA_256函数破坏内存空间,c,sha256,message-digest,C,Sha256,Message Digest,我一直试图在FreeBSD 9.1系统上使用sha256.h中的SHAU256函数,但它似乎破坏了我程序的内存空间,导致了各种疯狂行为。我写了一个快速的程序,只是为了玩这些功能,但仍然有问题 在下面的示例中,当我调用SHA256_Init()时,int i被更改,如围绕它的printf()语句的输出所示 这就是我运行代码得到的结果 $ ./miner "hello world" i = 0 i = 32 0000000032 9010a9cf81ce2c28a642fd03

我一直试图在FreeBSD 9.1系统上使用sha256.h中的SHAU256函数,但它似乎破坏了我程序的内存空间,导致了各种疯狂行为。我写了一个快速的程序,只是为了玩这些功能,但仍然有问题

在下面的示例中,当我调用SHA256_Init()时,int i被更改,如围绕它的printf()语句的输出所示

这就是我运行代码得到的结果

$ ./miner "hello world"  
i = 0  
i = 32  
0000000032      9010a9cf81ce2c28a642fd03ddf6da5790c65c30cd4a148c4257d3fe488bacc7
为什么该值会更改为32?我错过什么了吗?代码如下

#include <sha256.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#define DIFFICULTY 0

int main(int argc, const char **argv) {
    uint nonce, i, j;
    SHA256_CTX ctx;
    size_t arglen;
    unsigned char digest[32];
    char * data;

    if(argc < 1) exit(1);
    arglen = strlen(argv[1]);
    data = malloc(arglen + 1);
    char digestStr[65];
    i = 0;
    do {
        nonce = i;
        strncpy(data, argv[1], arglen + 1);

        printf("i = %i\n", i);
        SHA256_Init(&ctx);
        printf("i = %i\n", i);

        SHA256_Update(&ctx, data, arglen);
        SHA256_Update(&ctx, (unsigned char *) &nonce, sizeof(nonce));
        SHA256_Final(digest, &ctx);
        SHA256_End(&ctx, digestStr);
        printf("%010i\t%s\n", i, digestStr);

        j = 0;
        while(j < 32 && digest[j] == '\0') {
            j++;
        }
        i++;
    } while(j < DIFFICULTY);

    free(data);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义难度0
int main(int argc,常量字符**argv){
当前,i,j;
SHA256_CTX CTX;
尺寸参数;
无符号字符摘要[32];
字符*数据;
如果(argc<1)退出(1);
arglen=strlen(argv[1]);
数据=malloc(arglen+1);
char-digestStr[65];
i=0;
做{
nonce=i;
strncpy(数据,argv[1],arglen+1);
printf(“i=%i\n”,i);
SHA256_Init(&ctx);
printf(“i=%i\n”,i);
SHA256_更新(&ctx,数据,arglen);
SHA256_更新(&ctx,(无符号字符*)&nonce,sizeof(nonce));
SHA256_最终版(摘要和ctx);
SHA256_端(&ctx,digestStr);
printf(“%010i\t%s\n”,i,digestStr);
j=0;
而(j<32&&digest[j]='\0'){
j++;
}
i++;
}而(j<难度);
免费(数据);
返回0;
}

我刚刚遇到了完全相同的问题并解决了它

问题在于,您的代码中包含的头与链接到应用程序中的SHA2库使用的头不同

在我的例子中,SHA256_CTX结构在openSSL库中的大小不同。openSSL库的结构比文件中的结构长度大8字节


函数SHA256_Init(&ctx)在SHA256_ctx结构上执行一个memset,该memset会破坏该结构后的8个额外随机字节。我之所以说随机,是因为它在版本和调试版本中会做不同的事情,因为优化编译器会移动您的变量。

“SHA_256函数”或代码中的错误?-我知道我的钱在哪里……我从来没有说过SHA265函数是问题所在,只是它们“似乎”正在腐蚀内存空间。不管是不是因为我把指针拧到了什么地方,这都无关紧要。它的代码非常简单,我之所以这么问,是因为以前使用过这些函数的人可能对我不熟悉的东西很熟悉,或者很快就发现了我代码中缺少的一些错误。显然这里有些地方出错了,因为函数可以工作,而且内存通常不会重写自己。。。好吧,除非这是一个更大的问题;)我不知道是什么原因导致了您的错误,但是您应该检查
if(argc<2)
,并且应该使用
%u
printf
a
uint