我一直试图在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;
}
最佳答案
我只是有这个完全相同的问题并解决了。
问题是您在代码中包含的标题与链接到应用程序中的SHA2库所使用的标题不同。
在我的情况下,openSSL库中的SHA256_CTX结构大小不同。 openSSL库的结构比文件中的结构长度大8个字节。
函数SHA256_Init(&ctx)在SHA256_CTX结构上执行一个memset,然后破坏该结构之后的8个额外的随机字节。我说随机是因为它在发行版和调试版中会做不同的事情,因为优化的编译器会移动您的变量。
关于c - SHA_256函数破坏内存空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16205633/