【发布时间】: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。链接的问题向您展示了如何做到这一点。
标签: c openssl cryptography sha sha512