Windows RDP协议中对 Windows 用户密码加密库使用

远程桌面协议(RDP, Remote Desktop Protocol)是一个多通道(multi-channel)的协议,让用户(客户端或称“本地电脑”)连上提供微软终端机服务的电脑(服务器端或称“远程电脑”)。大部分的Windows都有客户端所需软件。其他操作系统也有这些客户端软件,例如LinuxFreeBSDMac 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值