Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将一段代码移植到C++;(第一章) 我有以下看似简单的PHP代码,它是一个CHAP实现的一部分,我需要把它加入到C++项目中: $response = md5("\0" . hash('sha256', $password) . pack('H32', $challenge);_Php_C++_Openssl_Md5_Challenge Response - Fatal编程技术网

将一段代码移植到C++;(第一章) 我有以下看似简单的PHP代码,它是一个CHAP实现的一部分,我需要把它加入到C++项目中: $response = md5("\0" . hash('sha256', $password) . pack('H32', $challenge);

将一段代码移植到C++;(第一章) 我有以下看似简单的PHP代码,它是一个CHAP实现的一部分,我需要把它加入到C++项目中: $response = md5("\0" . hash('sha256', $password) . pack('H32', $challenge);,php,c++,openssl,md5,challenge-response,Php,C++,Openssl,Md5,Challenge Response,这就是我到目前为止所做的: // should do what hash('sha256', $password) does string shaString(const string str) { unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256_CTX sha256; SHA256_Init(&sha256); SHA256_Update(&sha256, str.

这就是我到目前为止所做的:

// should do what hash('sha256', $password) does
string shaString(const string str)
{
        unsigned char hash[SHA256_DIGEST_LENGTH];
        SHA256_CTX sha256;
        SHA256_Init(&sha256);
        SHA256_Update(&sha256, str.c_str(), str.size());
        SHA256_Final(hash, &sha256);
        stringstream ss;
        for (int i = 0; i < SHA256_DIGEST_LENGTH; i++)
        {
                ss << hex << setw(2) << setfill('0') << (int)hash[i];
        }
        return ss.str();
}

// should do the rest
string md5String(const string password, const string challenge)
{
    int clen = challenge.length() / 2; // should be half length of hex values
    int plen = password.length() + 1;  // add one for null terminating string
    int tlen = clen + plen + 1;
    unsigned char *buffer = (unsigned char *) malloc(tlen);
    unsigned short buf;
    const char *pstr = password.c_str();
    unsigned char digest[MD5_DIGEST_LENGTH];
    MD5_CTX md5;

    memset(buffer, 0, tlen);

    // skip the first byte as we need to start with \0,
    // copy password starting at second byte
    memcpy(buffer + 1, pstr, plen);
    int start = plen + 1;

    // should be equivalent to pack('H32', $challenge)
    for (int j = 0; j < clen; j++) {
        if (scanf((challenge.substr(j * 2, 2)).c_str(), "%hx", &buf) < 1)
            break;
        buffer[start + j] = (unsigned char) buf;
    }

    MD5_Init(&md5);    // md5 what we got so far
    MD5_Update(&md5, buffer, tlen);
    MD5_Final(digest, &md5);
    stringstream ss;
    for (int i = 0; i < MD5_DIGEST_LENGTH; i++)
    {
        ss << hex << setw(2) << setfill('0') << (int)digest[i];
    }

    free(buffer);

    return ss.str();
}

string response = md5String(shaString(password.c_str()), challenge.c_str());
//应该像hash('sha256',$password)那样做
字符串shaString(常量字符串str)
{
无符号字符哈希[SHA256_摘要_长度];
SHA256_CTX SHA256;
SHA256_Init(&SHA256);
SHA256_更新(&SHA256,str.c_str(),str.size());
SHA256_Final(散列和SHA256);
细流ss;
对于(int i=0;ipack('H32',$challenge)
(2)您为什么必须为
buffer
使用原始数组?
string
有一个
+
操作符来连接字符串,从而轻松确定哪些步骤正确工作。