计算和打印 SHA256 hash 提醒文件 OpenSSL

我正在尝试编写一个功能 C, 使用 OpenSSL/libcrypto, 计算总和 SHA256 文件。 我在榜样上基于我的代码 Adam Lamer c++
http://adamlamers.com/?p=5
.

这是我的代码:


int main /int argc, char** argv/
{
char calc_hash[65];

calc_sha256/"file.txt", calc_hash/;
}

int calc_sha256 /char* path, char output[65]/
{
FILE* file = fopen/path, "rb"/;
if/!file/ return -1;

char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init/&sha256/;
const int bufSize = 32768;
char* buffer = malloc/bufSize/;
int bytesRead = 0;
if/!buffer/ return -1;
while//bytesRead = fread/buffer, 1, bufSize, file///
{
SHA256_Update/&sha256, buffer, bytesRead/;
}
SHA256_Final/hash, &sha256/;

sha256_hash_string/hash, output/;
fclose/file/;
free/buffer/;
return 0;
}

void sha256_hash_string /char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65]/
{
int i = 0;

for/i = 0; i < SHA256_DIGEST_LENGTH; i++/
{
sprintf/outputBuffer + /i * 2/, "x", hash[i]/;
}

outputBuffer[64] = 0;
}


问题是 this....take 查看下面的计算金额为文件示例:


Known good SHA256: 6da032d0f859191f3ec46a89860694c61e65460d54f2f6760b033fa416b73866
Calc. by my code: 6dff32ffff59191f3eff6affff06ffff1e65460d54ffff760b033fff16ff3866


我也得到了 * stack smashing detected *, 代码完成执行时。

有人看到我做错了什么吗?

谢!
已邀请:

君笑尘

赞同来自:

似乎有很多街区在你的结论中。 '0xff', 并且在一个很好的行中的相应块有一个高点......也许某处存在符号扩展的问题。

没有:


char hash[SHA256_DIGEST_LENGTH];


没有签名,例如:


unsigned char hash[SHA256_DIGEST_LENGTH];


帮助? /特别是在签名中
sha256_hash_string

./

裸奔

赞同来自:

你正在打字

标志

char

作为整数。 如果字节是否定的,则它将转换为
signed int

/

默认参数

用于呼叫
sprintf

/, 然后转换为
unsigned int

/通过格式说明书
%x

/ 并印刷。

所以字节
A0

是一个 -96 作为符号字节,转换为 -96 作为
signed int

, 那是 0xFFFFFFA0 在 hex, 所以他印刷为 FFFFFFA0.

要在打印每个字节之前修复它应记录在
unsigned char

:


sprintf/..., /unsigned char/hash[i]/;


你有关于打破堆栈的警告,因为最后 hash 有一个符号字节,所以你写下了 8 字节 FFFFFFB7 流离失所 58, 当你打算只写下来 2 字节。 它导致了

http://en.wikipedia.org/wiki/Buffer_overflow
, 这里发现了,因为编译器很可能插入安全区域或文件 cookie 返回值之前堆栈中的安全性,发现此安全区域发生意外更改。

要回复问题请先登录注册