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

时间:2009-12-27 20:25:46

标签: 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];

1 个答案:

答案 0 :(得分:2)

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

无论如何,要复制原始数据,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]);
}