远程桌面协议(RDP, Remote Desktop Protocol)是一个多通道(multi-channel)的协议,让用户(客户端或称“本地电脑”)连上提供微软终端机服务的电脑(服务器端或称“远程电脑”)。大部分的Windows都有客户端所需软件。其他操作系统也有这些客户端软件,例如Linux、FreeBSD、Mac OS X。服务端电脑方面,则听取送到TCP3389端口的数据。(百度百科)
最近在公司的项目中使用到 RDP 协议,需要对当前用户的密码加密然后写入 *.rdp 文件密码位置,因此对使用加密库作此记录以方便日后使用。编写的源代码如下:
头文件和库
#include <windows.h>
#include <Wincrypt.h>
#pragma comment(lib, "crypt32.lib")
/* RDP用户密码 */
char *password = "123456789";
/* 对密码进行加密 */
DATA_BLOB DataIn;
DATA_BLOB DataOut;
// mstsc.exe中使用的是unicode,所以必须做宽字符转换
BYTE *pbDataInput = (BYTE *)char2wchar(password);
DWORD cbDataInput = wcslen(char2wchar(password)) * sizeof(wchar_t);
DataIn.pbData = pbDataInput;
DataIn.cbData = cbDataInput;
if (CryptProtectData(&DataIn, L"password", // A description string
//to be included with the
// encrypted data.
NULL, // Optional entropy not used.
NULL, // Reserved.
NULL, // Pass NULL for the
// prompt structure.
0,
&DataOut))
{
/* 加密后转换成 string 的密码 */
std::string *out_string = byteToHexStr(DataOut.pbData, DataOut.cbData);
/* 读取 RDP 配置文件并修改加密后的登录密码 */
read_rdp_settings_file(file_name, *out_string);
/* 释放保存 RDP 密码的内存空间 */
delete out_string;
out_string = nullptr;
}
/* byte 数组转16进制 string 字符串 */
string* byteToHexStr(unsigned char byte_arr[], int arr_len)
{
string* hexstr = new string();
for (int i = 0; i < arr_len; i++)
{
char hex1;
char hex2;
/*借助C++支持的unsigned和int的强制转换,把unsigned char赋值给int的值,那么系统就会自动完成强制转换*/
int value = byte_arr[i];
int S = value / 16;
int Y = value % 16;
//将C++中unsigned char和int的强制转换得到的商转成字母
if (S >= 0 && S <= 9)
hex1 = (char)(48 + S);
else
hex1 = (char)(55 + S);
//将C++中unsigned char和int的强制转换得到的余数转成字母
if (Y >= 0 && Y <= 9)
hex2 = (char)(48 + Y);
else
hex2 = (char)(55 + Y);
//最后一步的代码实现,将所得到的两个字母连接成字符串达到目的
*hexstr = *hexstr + hex1 + hex2;
}
return hexstr;
}
/* char 字符串转转成宽字符串 */
wchar_t * char2wchar(const char* cchar)
{
wchar_t *m_wchar;
int len = MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), NULL, 0);
m_wchar = new wchar_t[len + 1];
MultiByteToWideChar(CP_ACP, 0, cchar, strlen(cchar), m_wchar, len);
m_wchar[len] = '\0';
return m_wchar;
}