我有一个程序C,它计算sha256输入文件的哈希值。它正在使用openSSL图书馆。这是程序的核心:
#include <openssl/sha.h>
SHA256_CTX ctx;
unsigned char buffer[512];
SHA256_Init(&ctx);
SHA256_Update(&ctx, buffer, len);
SHA256_Final(buffer, &ctx);
fwrite(&buffer,32,1,stdout);
Run Code Online (Sandbox Code Playgroud)
我需要改变它来计算sha512哈希。
我可以(天真地)将函数的所有名称从SHA256to更改为SHA512,然后在最后一步更改fwrite64 个字节,而不是32bytes 吗?仅此而已,还是我必须进行更多更改?
Run Code Online (Sandbox Code Playgroud)int SHA256_Init(SHA256_CTX *c); int SHA256_Update(SHA256_CTX *c, const void *data, size_t len); int SHA256_Final(unsigned char *md, SHA256_CTX *c); unsigned char *SHA256(const unsigned char *d, size_t n, unsigned char *md);...
Run Code Online (Sandbox Code Playgroud)int SHA512_Init(SHA512_CTX *c); int SHA512_Update(SHA512_CTX *c, const void *data, size_t len); int SHA512_Final(unsigned char *md, SHA512_CTX *c); unsigned char *SHA512(const unsigned char *d, size_t n, unsigned char *md);...
SHA1_Init() 初始化一个 SHA_CTX 结构。
SHA1_Update() 可以使用要散列的消息块(数据中的 len 个字节)重复调用。
SHA1_Final() 将消息摘要放在 md 中,它必须有空间用于 SHA_DIGEST_LENGTH == 20 字节的输出,并擦除 SHA_CTX。
SHA224、SHA256、SHA384 和 SHA512 系列函数的运行方式与 SHA1 函数相同。请注意,SHA224 和 SHA256 使用 SHA256_CTX 对象而不是 SHA_CTX。SHA384 和 SHA512 使用 SHA512_CTX。缓冲区 md 必须为正在使用的 SHA 变体的输出(由 SHA224_DIGEST_LENGTH、SHA256_DIGEST_LENGTH、SHA384_DIGEST_LENGTH 和 SHA512_DIGEST_LENGTH 定义)提供空间。另请注意,对于上面的 SHA1() 函数,如果 md 为 NULL,则 SHA224()、SHA256()、SHA384() 和 SHA512() 函数不是线程安全的。
为了确认,让我们看一些代码段。首先是 SHA256:
SHA256_CTX ctx;
unsigned char buffer[512];
char *str = "this is a test";
int len = strlen(str);
strcpy(buffer,str);
SHA256_Init(&ctx);
SHA256_Update(&ctx, buffer, len);
SHA256_Final(buffer, &ctx);
fwrite(&buffer,32,1,stdout);
Run Code Online (Sandbox Code Playgroud)
当运行为:
int SHA256_Init(SHA256_CTX *c);
int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA256_Final(unsigned char *md, SHA256_CTX *c);
unsigned char *SHA256(const unsigned char *d, size_t n,
unsigned char *md);
Run Code Online (Sandbox Code Playgroud)
输出:
int SHA512_Init(SHA512_CTX *c);
int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA512_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA512(const unsigned char *d, size_t n,
unsigned char *md);
Run Code Online (Sandbox Code Playgroud)
与以下输出匹配:
SHA256_CTX ctx;
unsigned char buffer[512];
char *str = "this is a test";
int len = strlen(str);
strcpy(buffer,str);
SHA256_Init(&ctx);
SHA256_Update(&ctx, buffer, len);
SHA256_Final(buffer, &ctx);
fwrite(&buffer,32,1,stdout);
Run Code Online (Sandbox Code Playgroud)
这是:
./test1 | od -t x1
Run Code Online (Sandbox Code Playgroud)
现在使用您建议的更改相同的代码:
SHA512_CTX ctx;
unsigned char buffer[512];
char *str = "this is a test";
int len = strlen(str);
strcpy(buffer,str);
SHA512_Init(&ctx);
SHA512_Update(&ctx, buffer, len);
SHA512_Final(buffer, &ctx);
fwrite(&buffer,64,1,stdout);
Run Code Online (Sandbox Code Playgroud)
通过“od”时的输出为我们提供:
0000000 2e 99 75 85 48 97 2a 8e 88 22 ad 47 fa 10 17 ff
0000020 72 f0 6f 3f f6 a0 16 85 1f 45 c3 98 73 2b c5 0c
0000040
Run Code Online (Sandbox Code Playgroud)
与以下输出匹配:
echo -n "this is a test" | openssl sha256
Run Code Online (Sandbox Code Playgroud)
这是:
(stdin)= 2e99758548972a8e8822ad47fa1017ff72f06f3ff6a016851f45c398732bc50c
Run Code Online (Sandbox Code Playgroud)