SHA1在C ++中返回不正确长度的哈希值

时间:2014-10-13 06:34:37

标签: c++ hash openssl sha

在下面的C ++代码中,SHA1应该返回20 length hash个值。 大多数情况下,id长度为20(这是正确的)。但有时它是6或4.不知道为什么。请帮忙。

#include <openssl/sha.h>
#include <limit.h>
#include <other common libraries>

void calc_id(char * ip, unsigned short port, unsigned char *id)
{
      char data[256];
      int len;

      //format print
      len = snprintf(data, 256,"%s%u", ip, port);
      cout<<"length is :: "<<len<<endl;
      cout<<"data is ::" << data<<endl;

      //id is just the SHA1 of the ip and port string
      SHA1((unsigned char *) data, len, (unsigned char *) id);
      cout << "SHA1 hash is :: " << id << endl;
      cout << "length of hash is" << lengthOfU(id) <<endl;

      return;
}

int lengthOfU(unsigned char * str)
{
    int i = 0;
    while (*(str++))
    {
        i++;
        if (i == INT_MAX) //INT_MAX from limit.h
            return -1;
    }
    return i;
}

ip就像127.0.0.1

端口就像6671

我正在尝试计算ip port对的唯一ID。 SHA1哈希将是一些“特殊”字符,但长度应为20.

2 个答案:

答案 0 :(得分:1)

与其他哈希一样,SHA1是二进制字节序列。不要在其上使用strlen(也不要手写自己的strlen)。如果那里有\0你将会被截断;如果那里有一个\0,那么你将开始阅读未分配的内存。

如果您想将它作为字符串,则需要将其转换为十六进制;那么它的长度是40。

答案 1 :(得分:0)

因为id不是字符串,所以它是20个字节的集合,而零是其中一个字节的完全有效值。

在调用 lengthOfU

之前,您需要将其变为十六进制字符串