c - 使用 libcrypto 将哈希复制到字符数组

标签 c hash openssl

我正在遵循以下位置的代码示例:http://www.openssl.org/docs/crypto/sha.html#

执行以下操作后:

EVP_DigestFinal_ex(&mdctx, md_value, &md_len);

最终摘要存储在 md_value 中。我想将该摘要复制到另一个相同大小的字符数组。但这是一个由两部分组成的问题。我不明白 md_value 中到底存储了什么,看起来像二进制。下面的 printf 将数据格式化为输出十六进制,这就是我所需要的..涉及的哈希的最终字符串版本(在我有上下文的循环中:

printf("val: %02x\n", md_value[i]);

我的问题是,如何仅将十六进制值复制到另一个字符数组。这是我到目前为止所尝试过的,就示例而言,这很糟糕:

for(i = 0; i < md_len; i++) {
    unsigned char c;
   printf("val: %02x\n", md_value[i]);
    sprintf(c, "%02x", md_value[i]);
    h[0] = c;
}
在这种情况下,

h 是我想要复制十六进制字符的位置。它是一个字符数组,如下所示:

unsigned char h[EVP_MAX_MD_SIZE];

最佳答案

从您的问题中我不确定您是否想要复制原始数据或创建格式化文本字符串。

无论如何,要复制原始数据,memcpy 就是你想要的:

unsigned char *copy = malloc(md_len);
memcpy(copy, md_value, md_len);

如果你想创建一个格式化字符串,那就需要 sprintf:

// each byte needs two chararacters for display plus 1 for terminating NULL
char *formatted = malloc(md_len * 2 + 1);

for (idx = 0; idx < md_len; ++idx)
{
    sprintf(formatted + idx * 2, "%02x", md_value[idx]);
}

关于c - 使用 libcrypto 将哈希复制到字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1966942/

相关文章:

可以优化这种不稳定的访问吗?

C++ : Writing a custom hash function for unordered_set that uses the number of buckets in the hash table

Qt OpenSSL 问题 - 在某些计算机上被阻止(?)

javascript - 使用 CryptoJS (JAVASCRIPT) 和 OpenSSL (PHP) 实现相同的加密

php - 注册和登录密码哈希方法相同但不起作用

C为不同的字符串获取相等的哈希值openssl

c - 在 C 中修改 const char *

C 将char数组(字符串)UTF8格式转换为CP1252(ASCII)格式

c - 信号在插入的飞行小部件中不起作用

ruby-on-rails - Ruby 语法错误,意外 '=' ,期望 ')'