使用 CryptDataProtect 输出用于 RDP 文件的加密密码会生成不正确的哈希值

Using CryptDataProtect to output encrypted password for use in RDP file generates the incorrect hash

提问人:PenguinKenny 提问时间:3/2/2023 更新时间:3/2/2023 访问量:52

问:

我正在尝试在 C++ 中生成一个 RDP 文件以自动登录到远程计算机。我正在使用 CryptProtectData 函数生成一个加密字符串,然后可以将其写入文件的参数。但是,当我尝试连接此文件时,它说密码无效。password 51:b

我尝试了以下代码:

#include <dpapi.h>
#include <sstream>

DATABLOB in ;
DATABLOB out ;
BYTE *pw_text = (BYTE *)L"to_encrypt"; // RDP uses unicode from my understanding...
DWORD pw_length = wcslen(L"to_encrypt");

in.pbData = pw_text ;
in.cbData = pw_length ;

CryptProtectData(&pw_in, L"PSW", NULL, NULL, NULL, NULL, &pw_out);

std::stringstream ss ;
ss << std::hex ;

for (int i = 0; i< pw_out.cbData; i++)
{
    ss << std::setw(2) << std::setfill('0') << (int)pw_out.pbData[i] ;
}

但是,当我获取 中包含的字符串时,将其粘贴到我的 RDP 文件中并尝试连接它说密码不正确。ss

如果我使用 Powershell 命令加密密码并使用它,但如果我可以在 C++ 中与应用程序的其余部分一起执行此操作会更好。

C++ RDP DPAPI

评论

0赞 PenguinKenny 3/2/2023
我从以下链接中获得了一些信息:这个和这个

答:

1赞 MikeCAT 3/2/2023 #1

DATA_BLOB结构中的字段是长度(以字节为单位)。cbData

另一方面,wcslen 函数返回字符数。

一个宽字符使用 2 个字节表示,因此会有一些差异。

尝试将一个字符的大小乘以字符数。

DWORD pw_length = sizeof(*L"a") * wcslen(L"to_encrypt");

评论

0赞 PenguinKenny 3/2/2023
就这么简单,不是吗......谢谢,这很有效:)我做了sizeof(wchar_t)