具體是什麼我想要做的是生成PassStub領域遠程協助票證。問題是我的結果看起來像二進制數據,但不知何故微軟生成可打印的字符。第6部分:微軟表示,「PassStub」字段使用PROV_RSA_FULL預定義的加密提供程序和MD5哈希以及CALG_RC4(RC4流加密算法)加密。 「使用的CryptoAPI生成ASCII密文
有一個數據流程圖這裏: http://msdn.microsoft.com/en-us/library/cc240189(PROT.10).aspx#id16
圖顯示了散列密碼與一「RA SessionID的」它看起來像這樣加密:u0RIQibSMntm0wAHQZ2mhatI63sjMjX15kh/vnciytOix8z6w + 36B01OiJoB5uYe
當我打電話CryptEncrypt結果是有關SessionID長度的二進制數據。微軟在某種程度上得到的東西看起來是這樣的:「寶^ 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;
它看起來base64編碼,但在考慮的鏈路的圖提到十六進制編碼又名基16編碼。 – 2010-01-23 02:00:29
我只能在Vista/Server 2008/Windows 7圖中看到十六進制編碼。這使用AES而不是RC4,所以我不認爲這是他想要實現的。 – 2010-01-23 06:07:47
是^是它的一部分,這就是爲什麼這很有趣。如果你創建一個遠程協助票據文件並且看它,你會看到我在說什麼。 – 2010-01-24 17:40:13