0

具体来说,我想要做的是为远程协助票生成 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;
4

1 回答 1

1

“RA SessionID”看起来像是base64 编码的。我的猜测是 pass-stub 也是 base64 编码的——除了你的例子:“Po^1BiNrHBvHGP”太短并且包含一个 ^。这是一个真实的例子吗?

您可能还需要对 RA 会话 ID 进行 base64 解码,然后再将其提供给 CryptEncrypt。

于 2010-01-22T19:18:38.490 回答