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

SHA1 returning hash of incorrect length in C++

本文关键字:不正确 哈希 返回 C++ SHA1      更新时间:2023-10-16

在下面的C++代码中,SHA1应该返回20个长度的哈希值。大多数情况下,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。

SHA1和其他散列一样,是一个二进制字节序列。不要在上面使用strlen(也不要手写自己的strlen)。如果有一个,你会得到截断;如果有而不是一个,你将开始读取未分配的内存。

如果你想把它作为一个字符串,你需要把它转换成十六进制;那么它将具有长度40。

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

在调用lengthOfU

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