具体来说,我要做的是为远程协助票证生成PassStub字段。问题是我的结果看起来像二进制数据,但微软会以某种方式生成可打印的字符。
在[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长度的二进制数据。微软以某种方式获得了这样的东西:“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;
答案 0 :(得分:1)
“RA SessionID”看起来像base64-encoded。我的猜测是pass-stub也是base64编码的 - 除了你的例子:“Po ^ 1BiNrHBvHGP”太短并且包含^。这是一个真实的例子吗?
您可能还需要对RA会话ID进行base64解码,然后再将其提供给CryptEncrypt。