-3
#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

データの内容を変えなくても写は毎回変わる

4

3 に答える 3

6
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の代わりに渡すことです&string1。についても同様digestです。

于 2013-07-28T17:51:50.903 に答える
1

コードのこの部分に問題があります:

free(string1);

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

呼び出しfreestring1から再度使用string1すると、これは未定義の動作です。freeを完全に使い終わってから呼び出す必要がありますstring1。2番目の問題は次のとおりです。

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

string1はすでにのアドレスをchar *取得しているため、 が得られます。または のいずれかになる可能性があるため、 aが必要なときにa を使用しても問題ないことも明確ではありません。&string1char **char *unsigned chat *charsignedunsigned

于 2013-07-28T17:54:07.093 に答える
1

SHA1 関数に渡すときに string1 のアドレスを取得しています。ただし、string1 はすでに const char * 型です。したがって、& を削除するだけです。

于 2013-07-28T17:52:14.017 に答える