0

我一直在尝试在 FreeBSD 9.1 系统上使用 sha256.h 中的 SHA_256 函数,但它似乎正在破坏我的程序的内存空间,从而导致各种躁狂行为。我编写了一个快速程序来使用这些功能,但仍然遇到问题。

在下面的示例中,当我调用 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;
}
4

1 回答 1

1

我刚刚遇到了同样的问题并解决了。

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

就我而言,SHA256_CTX 结构在 openSSL 库中的大小不同。openSSL 库的结构比文件中的结构长度大 8 个字节。

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

于 2013-12-05T21:06:43.843 回答