gpt4 book ai didi

c - 在 OpenSSL 中多次调用 Digest Update

转载 作者:太空宇宙 更新时间:2023-11-04 04:32:09 25 4
gpt4 key购买 nike

我读过,为了使用 EVP_Digest 调用发送要散列的大数据,可以多次调用 EVP_DIgestUpdate。

我需要调用 EVP_Update 并获取部分计算的哈希值,然后发送其余输入(连同部分计算的哈希值)以计算输入的整个哈希值。

我写了下面的代码来测试:

 int try()
{
EVP_MD_CTX ctx;
const EVP_MD *md;
//char data[] = "Test Message\n";
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len, i;
char *data = "test";

OpenSSL_add_all_digests();

md = EVP_get_digestbyname("SHA256");

if(!md) {
printf("Unknown message digest\n");
exit(1);
}
EVP_MD_CTX_init(&ctx);
EVP_DigestInit_ex(&ctx, md, NULL);
EVP_DigestUpdate(&ctx, data, strlen(data));
//EVP_DigestUpdate(&ctx, toB64val, strlen(toB64val));
EVP_DigestFinal_ex(&ctx, md_value, &md_len); //retrieve digest from ctx unto md_value and #bytes written is copied into md_len


EVP_MD_CTX newctx;
//char data[] = "Test Message\n";
unsigned char new_md_value[EVP_MAX_MD_SIZE];
unsigned int new_md_len;

EVP_MD_CTX_init(&newctx);
EVP_DigestInit_ex(&newctx, md, NULL);
char *newdata = " message";
printf("md_len = %d\n", md_len);
int newlen = md_len;
EVP_DigestUpdate(&newctx, md_value, 32);
EVP_DigestUpdate(&newctx, newdata, strlen(data));
//EVP_DigestUpdate(&ctx, toB64val, strlen(toB64val));
EVP_DigestFinal_ex(&newctx, new_md_value, &new_md_len);

EVP_MD_CTX_cleanup(&newctx);

printf("Digest is: ");
for(i = 0; i < new_md_len; i++) printf("%02x", new_md_value[i]);
printf("\n");

return 0;

}

我正在尝试计算“测试消息”的哈希 (sha256) 作为我的输入。但是,我需要能够检索“测试”的“部分计算的散列”,然后将其再次提供给整个输入的另一个新上下文计算。

然而,单独计算的散列值 o“测试消息”不匹配。有人可以帮忙吗?

谢谢

最佳答案

SHA256 block 大小为 64 字节,因此您只能在输入消息的 64 字节边界上获得有意义的部分哈希。在内部,EVP 正在缓冲消息,直到它达到 64 字节。

当请求哈希结果时,消息用 1 位填充,然后是 0 位,然后是 64 位消息长度(以位为单位)以使其成为 64 字节的倍数。

因此,您计算的第一个散列是在消息之上:

{"test", 1'b1, 415'b0, 64'h32}

其次,即使您的部分消息是 64 字节的倍数,您也不能只将部分散列作为数据传递给新散列。假设您打算在最后一次调用 EVP_DigestUpdate 时传递 strlen(newdata) 而不是 strlen(data),您计算的散列将超过填充的 320 位消息:

{<32-byte hash>, " message", 1'b1, 127'b0, 64'h320}

这与填充的 96 位消息的哈希不同:

{"test message", 1'b1, 351'b0, 64'h96}

为了继续部分哈希,必须保存和恢复哈希状态(A B C D E F G H)(不确定 EVP 是否为此提供了 API)。因为您的部分消息太短了,散列状态不会从初始更新,消息残留(末尾未完成 block 的部分)将位于 EVP 上下文内的缓冲区中,等待更多的数据组成一个 block 。因此,除了哈希状态之外,您还需要保存和恢复消息残留。

关于c - 在 OpenSSL 中多次调用 Digest Update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com