【问题标题】:C++ Sha1 issue with using char *使用 char * 的 C++ Sha1 问题
【发布时间】:2013-07-28 17:47:54
【问题描述】:
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>
#include <string.h>
#include <iostream>
#include <stdlib.h>
#include <sstream>

using namespace std;

int main()
{
std::stringstream ss;

    std::string data;
    data = "hello worl";
    unsigned char digest[SHA_DIGEST_LENGTH];
    char *string1 = strdup(data.c_str());
    // do stuff with string1
    free(string1);

    SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);    

    char mdString[SHA_DIGEST_LENGTH*2+1];

    for(int i = 0; i < SHA_DIGEST_LENGTH; i++)
         sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);

ss.str("");
ss << mdString;

 cout << ss.str() << std::endl;
    return 0;
}

我的输出总是一样的..

./sha
da39a3ee5e6b4b0d3255bfef95601890afd80709

即使我将数据的内容更改为“hello panda”或“hello ki”也给我相同的输出。

更新: 我拿走了免费的

user1@ubuntu:~/yes/coding$ g++ -o sha sha.cpp -lcrypto
user1@ubuntu:~/yes/coding$ ./sha
1bc8b06c5cd4e774195293ea00c959173d8d3789
user1@ubuntu:~/yes/coding$ ./sha
c8cf70c522fc564aedb5894a24613542702172ca
user1@ubuntu:~/yes/coding$ ./sha
83fbda098c3549ab1347d6cf708ac85092200423
user1@ubuntu:~/yes/coding$ ./sha
ea6ccffd78236e22da412ed90a852329f59f8fd5
user1@ubuntu:~/yes/coding$ ./sha
0413799befebcb23f5a5c970e48febc7f1aa27fb
user1@ubuntu:~/yes/coding$ ./sha
7bd8e7952c78e282b8c117f8c537c456b66207d9

sha每次都在变化,即使我没有改变数据的内容

【问题讨论】:

  • 你真的在string1上打电话free然后再用吗?
  • 我用// do stuff with string1 写的评论意味着你需要在之前免费做所有你想做的事情。 (我认为这是我之前回答的问题的复制粘贴)
  • 另外,在这种情况下,string1 = data.c_str() 就足够了,因为您实际上并不需要 复制 到新数组。对于 C 函数,您只需要一个指向它的指针。

标签: c++


【解决方案1】:
char *string1 = strdup(data.c_str());
// do stuff with string1
free(string1);

SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);

这是你的错误。

  • 您创建了 string1
  • 你用过它
  • 你释放了它
  • 你又用了一次

不要释放你仍然需要使用的东西。


除此之外:

SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);

您在这里所做的是将char* string1 的地址转换为unsigned char*。你想要做的是通过string1 而不是&amp;string1。这同样适用于digest

【讨论】:

  • 你能告诉我们你的新代码吗?您要么仍然有未定义的行为,要么正在使用内存地址作为值:p
【解决方案2】:

在将 string1 传递给 SHA1 函数时,您正在获取它的地址。但是,string1 已经是 const char * 类型。所以只需删除 &。

【讨论】:

    【解决方案3】:

    你这部分代码有问题:

    free(string1);
    
    SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest); 
    

    您在string1 上调用free,然后再次使用string1,这是未定义的行为。只有在完全使用string1 之后,您才需要调用free。第二个问题在这里:

    SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest); 
         ^^^^^^^^^^^^^^^^^^^^^^^^
    

    string1 已经是一个char *,使用&amp; 地址string1 会给你一个char **。我也不清楚当你需要unsigned chat * 时使用char * 是可以的,因为char 可以是signedunsigned

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2011-07-04
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多