В частности, я пытаюсь создать поле PassStub для билета Remote Assistance. Проблема в том, что мои результаты выглядят как двоичные данные, но каким-то образом Microsoft генерирует печатные символы.
В [MS-RAI]: спецификация протокола инициирования удаленного помощника <16> Раздел 6: Microsoft сообщает, что поле "PassStub" "зашифровано с использованием предопределенного поставщика криптографии PROV_RSA_FULL с хешированием MD5 и CALG_RC4, алгоритма потокового шифрования RC4.
Здесь представлена схема потока данных:
http://msdn.microsoft.com/en-us/library/cc240189(PROT.10).aspx#id16
На схеме показано, что хешированный пароль шифруется с помощью «RA SessionID», который выглядит примерно так:
Когда я вызываю CryptEncrypt, результатом являются двоичные данные о длине SessionID. Microsoft как-то получает что-то похожее на это: "Po ^ 1BiNrHBvHGP"
Вот код, который я пытаюсь использовать для этого:
HCRYPTPROV hCryptProv;
HCRYPTKEY hKey;
HCRYPTHASH hHash;
BOOL bret=0;
passwordlen = SysStringByteLen(L"password");
char RASessionID[] = "u0RIQibSMntm0wAHQZ2mhatI63sjMjX15kh/vnciytOix8z6w+36B01OiJoB5uYe";
//----------------------------------------------------------------
// Acquire a cryptographic provider context handle.
if(!CryptAcquireContext(&hCryptProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0))
{
return FALSE;
}
//----------------------------------------------------------------
// Create an empty hash object.
if(!CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash))
{
return FALSE;
}
if(!CryptHashData(hHash, (BYTE *)bpassword, passwordlen, 0))
{
return FALSE;
}
//----------------------------------------------------------------
// Create a session key based on the hash of the password.
if(!CryptDeriveKey(hCryptProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey))
{
return FALSE;
}
DWORD rasessionidlen = strlen(rasessionid);
char* proxystub = (char*)malloc(rasessionidlen*2);
strcpy(proxystub, rasessionid);
bret = CryptEncrypt(hKey, NULL, TRUE, 0, (BYTE*)proxystub, &rasessionidlen, rasessionidlen*2);
return bret;