Использование CryptoAPI для генерации зашифрованного текста ascii

В частности, я пытаюсь создать поле PassStub для билета удаленного помощника. Проблема в том, что мои результаты выглядят как двоичные данные, но каким-то образом 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», который выглядит следующим образом: u0RIQibSMntm0wAHQZ2mhatI63sjMjX15kh/vnciytOix8z6w+36B01OiJoB5uYe.

Когда я вызываю 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;

person Jon Clegg    schedule 22.01.2010    source источник


Ответы (1)


"RA SessionID" выглядит так, как будто он закодирован в base64. Я предполагаю, что заглушка для прохода также имеет кодировку base64, за исключением того, что ваш пример: «Po ^ 1BiNrHBvHGP» слишком короткий и содержит ^. Это реальный пример?

Вам также может потребоваться декодировать идентификатор сеанса RA с помощью base64, прежде чем передавать его в CryptEncrypt.

person Rasmus Faber    schedule 22.01.2010
comment
Он выглядит в кодировке base64, но на диаграмме в ссылке в вопросе упоминается шестнадцатеричное кодирование, также известное как кодирование base-16. - person President James K. Polk; 23.01.2010
comment
Я вижу только шестнадцатеричную кодировку на диаграмме Vista/Server 2008/Windows 7. Он использует AES вместо RC4, так что я не думаю, что это то, что он пытается реализовать. - person Rasmus Faber; 23.01.2010
comment
Да, ^ является частью этого, поэтому это интересно. Если вы создадите файл заявки на удаленную помощь и посмотрите на него, вы поймете, о чем я говорю. - person Jon Clegg; 24.01.2010