带有UTF16LE的md5 inC ++

时间:2019-08-05 17:23:04

标签: python c++ openssl md5

我正在尝试将Python代码传输到C ++。

是否可以将字符串转换为UTF16LE并从OpenSSL使用MD5?

使用提供智能家居功能的路由器进行身份验证时,我需要此功能。

此代码可以正常使用字符串(UTF8),但是我需要UTF16LE,因为使用UTF8和UTF16LE的相同字符串的结果是不同的:

string Crypto::getMD5(string stringToCrypt)
{
    unsigned char digest[MD5_DIGEST_LENGTH];
    char charArray[stringToCrypt.size()+1];

    char mdString[33];

    strcpy(charArray,stringToCrypt.c_str());
    MD5((unsigned char*)&charArray, strlen(charArray), (unsigned char*)&digest); 

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

    return mdString;
}

在Python中,我只对字符串进行编码:

md5Hash = hashlib.md5()
md5Hash.update(input.encode('utf-16le'))
return md5Hash.hexdigest()

1 个答案:

答案 0 :(得分:0)

有点晚了,但这对我有用:

string Crypto::getMd5HashAsUtf16(string stringToHash)
{
    //convert input string(utf8) to utf16
    wstring_convert<codecvt_utf8_utf16<char16_t>,char16_t> wstringConverter; 
    u16string stringToCrypt16 = wstringConverter.from_bytes(stringToHash);    
    
    //create a char array
    char16_t bufferCharArr16[stringToCrypt16.size()+1];
    
    //fill char array from input string
    for(int i=0; i < stringToCrypt16.size(); i++)
    {
            bufferCharArr16[i] = stringToCrypt16.at(i);
    }
    
    //calc hash
    unsigned char digest[MD5_DIGEST_LENGTH];
    char mdString[33];

    MD5((unsigned char*)bufferCharArr16, stringToCrypt16.size()*sizeof(char16_t), (unsigned char*)&digest); 

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

    return mdString;
}