是否存在将SHA1哈希表示为C字符串的标准方法,以及如何转换为它?

时间:2010-10-19 13:52:13

标签: c++ c hash openssl

This question是关于如何使用OpenSSL库从C中的数据数组创建SHA-1哈希。

它返回一个包含哈希的20个字节的数组。是否有一些标准的方式以字符串形式表示数据,而不是二进制?

如果是这样,OpenSSL本身是否有一个函数转换为所述字符串格式?

如果没有,应该怎么做?当然,我可以编写自己的编码,使用base64或者不是,但是有一些规范的格式吗?

4 个答案:

答案 0 :(得分:12)

通常哈希表示为十六进制数字序列(当然,每字节两个)。您可以使用带有正确修饰符的ostringstream编写代码来轻松编写此类内容:

#include <string>
#include <sstream>
#include <iomanip>

std::string GetHexRepresentation(const unsigned char * Bytes, size_t Length)
{
    std::ostringstream os;
    os.fill('0');
    os<<std::hex;
    for(const unsigned char * ptr=Bytes;ptr<Bytes+Length;ptr++)
        os<<std::setw(2)<<(unsigned int)*ptr;
    return os.str();
}

答案 1 :(得分:3)

表示散列的标准方式是十六进制字符串 在C中,您可以使用printf("%02x", byte)来获取每个字节的十六进制表示。

MD5的示例应该很容易适应SHA:

http://en.literateprograms.org/MD5_sum_(C,_OpenSSL)

答案 2 :(得分:2)

以下是C:

的示例
//function
void convertSHA1BinaryToCharStr(const unsigned char * const hashbin, char * const hashstr) {
  for(int i = 0; i<20; ++i)
  {
    sprintf(&hashstr[i*2], "%02X", hashbin[i]);
  }
  hashstr[40]=0;
}

//Example call.  hashbin is the 20byte hash array.
char hashstr[41];
convertSHA1BinaryToCharStr(hashbin, hashstr);
printf("%s\n", hashstr);

答案 3 :(得分:0)

隐私增强邮件(或PEM)似乎为加密数据的文本表示的存储设置了标准。 PEM将实际的二进制块存储在Base64中,但也有文本页眉和页脚。