C++ 密码保护数据:C++;用于从MAPI配置文件的Crypt32.dll调用函数的代码

C++ 密码保护数据:C++;用于从MAPI配置文件的Crypt32.dll调用函数的代码,c++,encryption,exchange-server,mapi,C++,Encryption,Exchange Server,Mapi,我正在尝试使用CryptProtectData函数,以便可以加密密码并在MAPI配置文件中使用它。我正在使用这两篇文章 以及使用MFCMAPI连接到我的托管exchange(2013)帐户。设置我的所有属性时,系统会提示我输入凭据,但我遇到了一个问题,即为域提供的字段对于我的域来说太短。因此,我必须手动设置这些属性(第二篇文章介绍了如何设置) 现在我需要在我的MAPI配置文件中设置用户名和密码,似乎我需要自己加密密码(我必须构建一个应用程序来实现这一点)。我正在使用“MAPI下载配置指南.doc

我正在尝试使用CryptProtectData函数,以便可以加密密码并在MAPI配置文件中使用它。我正在使用这两篇文章 以及使用MFCMAPI连接到我的托管exchange(2013)帐户。设置我的所有属性时,系统会提示我输入凭据,但我遇到了一个问题,即为域提供的字段对于我的域来说太短。因此,我必须手动设置这些属性(第二篇文章介绍了如何设置)

现在我需要在我的MAPI配置文件中设置用户名和密码,似乎我需要自己加密密码(我必须构建一个应用程序来实现这一点)。我正在使用“MAPI下载配置指南.docx”(可从www.microsoft.com/en-us/Download/details.aspx?id=39045下载我正在使用的代码位于文档末尾)来构建我自己的应用程序来加密我的密码(我使用较小的示例只是加密密码,而不是创建整个配置文件)。我遇到了很多问题,应用程序没有在32位Windows上运行,而crypt32.lib丢失了(我必须自己创建)等等。现在我让它在64位机器上运行,但现在我不知道如何向程序提供数据

我有以下代码:

  std::string stemp = "myPassword";
  std::wstring stemp1 = std::wstring(stemp.begin(), stemp.end());
  LPWSTR pwszPassword = (LPWSTR)stemp1.c_str();//stemp.c_str();//
  HRESULT     hr = S_OK;
  DATA_BLOB   dataBlobIn = {0};
  DATA_BLOB   dataBlobOut = {0};
  SPropValue  propValues[2] = {0};
  // Validate parameters

  // Encrypt password based on local user authentication
  dataBlobIn.pbData = (LPBYTE)pwszPassword;
  // Include NULL character
  dataBlobIn.cbData = (::wcslen(pwszPassword) + 1) * sizeof(WCHAR);

  CryptProtectData(
        &dataBlobIn,
        NULL,
        NULL,
        NULL,
        NULL,
        0,
        &dataBlobOut);

 std::cout<<"\n-- ";
 std::wcout<<(dataBlobOut.cbData);
 std::cout<<" --\n";
 std::wcout<<(dataBlobOut.pbData);                              
std::string stemp=“myPassword”;
std::wstring stemp1=std::wstring(stemp.begin(),stemp.end());
LPWSTR pwszPassword=(LPWSTR)stemp1.c_str();//stemp.c_str()//
HRESULT hr=S_正常;
DATA_BLOB dataBlobIn={0};
DATA_BLOB databloout={0};
SPropValue propValues[2]={0};
//验证参数
//基于本地用户身份验证的密码加密
dataBlobIn.pbData=(LPBYTE)pwszPassword;
//包含空字符
dataBlobIn.cbData=(::wcslen(pwszPassword)+1)*sizeof(WCHAR);
加密保护数据(
&数据珠蛋白,
无效的
无效的
无效的
无效的
0,
&数据lobout);

std::cout很抱歉,我似乎没有用我的正确帐户发布消息(我不能用它写评论)

正如我所说,我正在尝试将加密数据输出到文本文件中:

std::ofstream myfile;
myfile.open ("encrypted.txt");
myfile << (LPCWSTR)(dataBlobIn.pbData);
std::of stream myfile;
myfile.open(“encrypted.txt”);

myfile您可以使用如下内容:

#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "crypt32")

int main(int argc, char** argv) {
    if(argc != 2) {
        fprintf(stdout, "usage: cpd <string>\n");
        exit(1);
    }

    const char* u = argv[1];

    DATA_BLOB db_i;
    db_i.cbData = static_cast<DWORD>(strlen(u));
    db_i.pbData = (BYTE*)(u);

    DATA_BLOB db_o = {0, NULL};
    if(!::CryptProtectData(&db_i, 
        NULL, NULL, NULL, NULL, 
        CRYPTPROTECT_UI_FORBIDDEN, 
        &db_o)) {
        fprintf(stdout, 
            "CryptProtectData failed with error %ld\n", 
            GetLastError());
    }
    else {
        short nl = 0;
        for(DWORD c = 0; c < db_o.cbData; c++) {
            if((c % 40) == 0)
                fprintf(stdout, "\n");
            fprintf(stdout, "%2.2x", db_o.pbData[c]);
        }
        LocalFree(db_o.pbData);
    }

    return 0;
}
#包括
#包括
#pragma注释(lib,“crypt32”)
int main(int argc,字符**argv){
如果(argc!=2){
fprintf(标准输出,“用法:cpd\n”);
出口(1);
}
常量char*u=argv[1];
数据块数据库;
db_i.cbData=静态(strlen(u));
db_i.pbData=(字节*)(u);
DATA_BLOB db_o={0,NULL};
如果(!::CryptProtectData(&db_i),
空,空,空,空,
密码保护被禁止,
&db_(o)){
fprintf(标准输出),
“CryptProtectData失败,错误为%ld\n”,
GetLastError());
}
否则{
短nl=0;
对于(DWORD c=0;c
字符串以十六进制表示形式写入(最多第80行)。您可以将格式化为std::字符串的db_o.pbData累积起来,以进行序列化(有多种方法可以做到这一点——我更喜欢为db_o.cbData*2+1分配一个字符*,以便为十六进制表示分配2个字符,为NUL终止符分配1个字符,然后为pbData中的每个字节顺序写入2个字符)


如果crypt32.lib不可用,您可以使用LoadLibrary/GetProcAddress动态加载函数。

加密数据的大小不会随(中的小变化)而改变这一事实密码的大小本身并不表示有问题。我打赌该算法涉及某种填充,比如说到最近的X字节边界。真正的测试是-
CryptUnprotectData
是否返回原始数据?
wcout您似乎期望加密的结果是一些人类可读的文本。我不是这样想的这将是一块看起来像垃圾的随机二进制数据,您不应该将加密数据复制/粘贴到UI中的文本字段中。您应该以编程方式配置配置文件。在这里,您以结构的形式指定密码材料,这与
data\u BLOB
非常相似。这在我看来非常好。相同的代码(在Delphi中)工作很好。你如何准确地将数据复制到配置文件中?
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "crypt32")

int main(int argc, char** argv) {
    if(argc != 2) {
        fprintf(stdout, "usage: cpd <string>\n");
        exit(1);
    }

    const char* u = argv[1];

    DATA_BLOB db_i;
    db_i.cbData = static_cast<DWORD>(strlen(u));
    db_i.pbData = (BYTE*)(u);

    DATA_BLOB db_o = {0, NULL};
    if(!::CryptProtectData(&db_i, 
        NULL, NULL, NULL, NULL, 
        CRYPTPROTECT_UI_FORBIDDEN, 
        &db_o)) {
        fprintf(stdout, 
            "CryptProtectData failed with error %ld\n", 
            GetLastError());
    }
    else {
        short nl = 0;
        for(DWORD c = 0; c < db_o.cbData; c++) {
            if((c % 40) == 0)
                fprintf(stdout, "\n");
            fprintf(stdout, "%2.2x", db_o.pbData[c]);
        }
        LocalFree(db_o.pbData);
    }

    return 0;
}