使用libcrypto到散列复制到字符数组

问题描述:

我以下的可用代码的示例:http://www.openssl.org/docs/crypto/sha.html#使用libcrypto到散列复制到字符数组

以下之后:

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的是你想要什么:

// 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]); 
} 
+0

好奇,请问:

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

如果你想创建一个格式化字符串,当你需要的sprintf这格式化+ idx * 2工作?对于每个索引,它基本上留下了两个字符的空间? – randombits 2009-12-27 20:48:21