【问题标题】:using libcrypto to copy hash to character array使用 libcrypto 将哈希复制到字符数组
【发布时间】:2009-12-27 20:25:45
【问题描述】:

我正在关注以下代码示例: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];

【问题讨论】:

    标签: c hash openssl


    【解决方案1】:

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

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

    【讨论】:

    • 好奇,formatted + idx * 2 是怎么工作的?对于每个索引,它基本上都会为两个字符留出空间?
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 2011-02-01
    • 2016-12-28
    • 2011-05-12
    • 1970-01-01
    • 2012-07-05
    • 2020-07-24
    • 1970-01-01
    相关资源
    最近更新 更多