如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?
Posted
技术标签:
【中文标题】如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?【英文标题】:How to calculate SHA512/224 and SHA512/256 hashes using OpenSSL? 【发布时间】:2018-06-07 14:23:05 【问题描述】:这是我在 C 中计算 SHA512 哈希的方法。
#include <openssl/sha.h>
#include <stdio.h>
char *calc_sha512(char *data)
SHA512_CTX ctx;
char *md = malloc(sizeof(char)*(SHA512_DIGEST_LENGTH+1));
SHA512_Init(&ctx);
SHA512_Update(&ctx, data, strlen(data));
SHA512_Final(md, &ctx);
md[SHA512_DIGEST_LENGTH] = '\0';
return md;
int main()
printf("%s\n", calc_sha512("foo"));
return 1;
现在,当我尝试将其转换为 512/t(512/224 或 512/256)时,它不起作用。我最初认为要计算 512/t 哈希,您只需将输出截断为 t 位,但在进一步阅读后,它不仅截断输出,它还有不同的初始常数值。所以我试图找出支持它的 OpenSSL 中的任何功能?到目前为止,我已经查看了文档和头文件,在 SHA 或 EVP 下都找不到这种方法。 OpenSSL 是否甚至支持 SHA512/t 哈希算法?它是否提供开箱即用的功能?任何指向它的指针都会有所帮助。
【问题讨论】:
另见 Kelsey 关于截断散列的讨论。他们并没有减少证明来自 SHA-1 和 SHA-2 系列的截断哈希与完整大小的哈希具有相同的安全性。 Cryptographic Hash Workshop (2005) - Truncation Mode for SHA.return md
可能会中断,因为哈希可能会嵌入 NULL。或者它不会在你期望的地方有一个 NULL 。您是否意识到它是二进制字符串而不是 ASCIIZ 字符串?另请参阅Calculate and print SHA256 hash of a file using OpenSSL、How to print SHA512 hash in C、Generate SHA hash in C++ using OpenSSL library(和朋友)。
@jww 这是我脑子里想出来的东西,我不希望它按照它写的方式运行。我试图在 C 中使用 OpenSSL 实现类似 this 的东西。我在 API 中找不到任何东西。有没有办法我甚至可以在 C 中手动做到这一点?
“我有没有办法在 C 语言中手动做到这一点” - 做什么? OpenSSL 具有 SHA-1 到 SHA-512。链接的问题向您展示了如何做到这一点。
【参考方案1】:
正如您所注意到的,那些截断的 sha512 哈希使用不同的初始化向量,如果它们只是从字面上截断这些字节,可能是为了避免泄露部分实际 sha512 哈希。
几个月前在 OpenSSL 主树中实现了对 sha512_256 的支持,并且可能会在 OpenSSL 1.1.1 中实现。
检查更新日志: https://www.openssl.org/news/changelog.txt
或者在 Github 上的提交: https://github.com/openssl/openssl/commit/4bed94f0c11ef63587c6b2edb03c3c438e221604
...因此,根据您所使用的平台,您可以在不久的将来使用这些新功能,就像您使用您提供的 sha512 示例一样。
【讨论】:
以上是关于如何使用 OpenSSL 计算 SHA512/224 和 SHA512/256 哈希?的主要内容,如果未能解决你的问题,请参考以下文章