C ++ Sha1问题与使用char * [英] C++ Sha1 issue with using char *
本文介绍了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 anunsigned char*
. What you want to do is passstring1
instead of&string1
. The same applies todigest
.这篇关于C ++ Sha1问题与使用char *的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文