C ++ Sha1问题与使用char * [英] C++ Sha1 issue with using char *

查看:173
本文介绍了C ++ Sha1问题与使用char *的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  #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());
//使用string1执行操作
free(string1);

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

char mdString [SHA_DIGEST_LENGTH * 2 + 1];

for(int i = 0; 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:〜/是/编码$ ./sha
1bc8b06c5cd4e774195293ea00c959173d8d3789
USER1 @ Ubuntu的:〜/是/编码$ ./sha
c8cf70c522fc564aedb5894a24613542702172ca
USER1 @ Ubuntu的:〜/是/编码$ ./sha
83fbda098c3549ab1347d6cf708ac85092200423
USER1 @ Ubuntu的:〜/是/编码$ ./sha
ea6ccffd78236e22da412ed90a852329f59f8fd5
USER1 @ Ubuntu的:〜/是/编码$ ./sha
0413799befebcb23f5a5c970e48febc7f1aa27fb
USER1 @ Ubuntu的:〜/是/编码$ ./sha
7bd8e7952c78e282b8c117f8c537c456b66207d9

即使我没有改变数据的内容,sha也会改变。

解决方案

  char * string1 = strdup(data.c_str()); 
//使用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 ,而不是& string1 。这同样适用于 digest


    #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;
    }
    

    My output always the same..

    ./sha
    da39a3ee5e6b4b0d3255bfef95601890afd80709
    

    Even i change the content of data to "hello panda" or "hello ki" also give me the same output.

    Update: I took away the free

    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
    

    The sha change everytime, even i did not change the content of data

    解决方案

    char *string1 = strdup(data.c_str());
    // do stuff with string1
    free(string1);
    
    SHA1((unsigned char*)&string1, strlen(string1), (unsigned char*)&digest);
    

    There's your error.

    • You created string1
    • You used it
    • You freed it
    • You used it again

    Don't free what you still need to use.


    In addition to that:

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

    What you're doing here is passing the address of char* string1 converted to an unsigned char*. What you want to do is pass string1 instead of &string1. The same applies to digest.

    这篇关于C ++ Sha1问题与使用char *的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆