Форум программистов, компьютерный форум CyberForum.ru

Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Hello world http://www.cyberforum.ru/cpp-beginners/thread938707.html
Здравствуйте при написании hello world возникает такая ошибка: error C2146: syntax error : missing ';' before identifier '_getch' Вот мой код #include "stdafx.h" #include <conio.h> #include <stdio.h> using namespace System;
C++ Пустой конструктор без аргументов Всем доброго времени суток. Я сейчас в процессе изучения С++, читаю книгу Лафоре "Объектно-ориентированное программирование в С++". На странице 242 имеется код, в котором используется пустой конструктор без аргументов. Вопрос: для чего он нужен? Неполный код: class card { private: int number; http://www.cyberforum.ru/cpp-beginners/thread938702.html
Как используя закрытое наследование использовать 2 объекта базового класса? C++
Доброго времени суток. Учусь по книге "Прата С. Язык программирования C++. Лекции и упражнения. Не могу понять упражнение...(глава 14, упр 2) Выполните еще раз упражнение 1, но вместо включения используйте закрытое наследование. С классом string всё понятно, но как сделать 2 объекта класса valarray? Упражнение 1 ниже. //head.h #ifndef HEAD_H_ #define HEAD_H_ #include <valarray>
разделения файла на части C++
Нужно написать программу для разделения файла на части. Вы указываете вашей программе файл, который нужно разделить, количество частей, на который нужно разделить файл, и ваша программа из одного файла делает несколько (по сути, разбавит файл на части). Подобная функция есть в архиваторе WinRAR (составной архив). Также должна быть предусмотрена обратная операция, чтобы из нескольких частей...
C++ Подготовка к решению сложных задач и задач олимп.уровня http://www.cyberforum.ru/cpp-beginners/thread938603.html
Собственно, интересует какую литературу стоит почитать, для решению сложных и интересных задач или может быть есть какие- нибудь известные в узком кругу форумы на эту тему
C++ Запись элемента строки в char Никак не получается записать элемент строки в переменную char. #include <iostream> #include <conio.h> #include <cstdlib> #include <math.h> #include <fstream> #include <sstream> подробнее

Показать сообщение отдельно
Dragokas
Эксперт WindowsАвтор FAQ
15833 / 6681 / 804
Регистрация: 25.12.2011
Сообщений: 10,345
Записей в блоге: 16

Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll - C++

16.08.2013, 01:08. Просмотров 1447. Ответов 17
Метки (Все метки)

Помогите, пожалуйста, написать за меня:
1) преобразование аргумента ком. строки -> в Unicode (какой не знаю): пытаюсь перевести код, данный в статье: http://www.remkoweijnen.nl/blog/2007...are-encrypted/

Нужно подставить в строки №№ 32, 57.

Наработки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#pragma comment(lib, "crypt32.lib")
 
#include <windows.h>
#include <stdio.h>  // printf
#include <stdlib.h> // system
#include <Wincrypt.h>
 
//#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
 
void MyHandleError(char *s);
 
/*
typedef int (__cdecl *pCryptProtectData)(
            DATA_BLOB *pDataIn,
            LPCWSTR szDataDescr,
            DATA_BLOB *pOptionalEntropy,
            PVOID pvReserved,
            CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
            DWORD dwFlags,
            DATA_BLOB *pDataOut);
 */
 
int main(int argc, char *argv[])
{
    //if (argc < 2) exit(0); //using();
 
    // Declare and initialize variables.
 
    DATA_BLOB DataIn;
    DATA_BLOB DataOut;
    DATA_BLOB DataVerify;
    BYTE *pbDataInput =(BYTE*)"secret"; //  <---- Need UNICODE. Here we trying to encrypt the word "secret"
    //BYTE *pbDataInput =(BYTE*)argv[1];
    DWORD cbDataInput = strlen((char*)pbDataInput)+1;
    DataIn.pbData = pbDataInput;
    DataIn.cbData = cbDataInput;
    LPWSTR pDescrOut = NULL;
 
    //  Begin processing.
 
    printf("The data to be encrypted is: %s\n", pbDataInput);
 
    // Get a handle to the DLL module
 
    /*
    if (HINSTANCE hinstLib = LoadLibrary(TEXT("crypt32.dll")))
    {
        // If the handle is valid, try to get the function address.
 
        if (pCryptProtectData CryptProtectData = (pCryptProtectData) GetProcAddress(hinstLib, "CryptProtectData"))
        {
        */
            // If the function address is valid, call the function
 
            if(CryptProtectData(
                &DataIn,
                L"psw",                             // <---- Need UNICODE also. RDP always sets description to "psw"
                NULL,                               // Optional entropy - not used.
                NULL,                               // Reserved.
                NULL,                               // Pass a PromptStruct.
                CRYPTPROTECT_UI_FORBIDDEN,          // Without user prompt.
                &DataOut))
            {
                // --> DATA_BLOB to HEX string
 
                for (int i = 0; i < (int)DataOut.cbData; i ++)
                {
                    printf("%02X", DataOut.pbData[i]);
                }
            }
            else
            {
                MyHandleError("Encryption error!");
            }
 
            if (CryptUnprotectData(
                &DataOut,
                &pDescrOut,
                NULL,                         // Optional entropy
                NULL,                         // Reserved
                NULL,                         // Optional PromptStruct
                0,
                &DataVerify))
            {
                printf("The decrypted data is: %s\n", DataVerify.pbData);
                printf("The description of the data was: %S\n",pDescrOut);
            }
            else
            {
                MyHandleError("Decryption error!");
            }
 
            //  Clean up.
 
            LocalFree(pDescrOut);
            LocalFree(DataOut.pbData);
 
            /*
        }
 
        // Free the DLL module
 
        BOOL fFreeResult = FreeLibrary(hinstLib);
    }
    */
 
    system("pause");
    return 0;
}
 
void MyHandleError(char *s)
{
    fprintf(stderr,"ERROR: %s\n",s);
    fprintf(stderr, "Error number %x.\n", GetLastError());
    system("pause");
    exit(1);
}


На MSDN и у большого Гугла нашел пару функций,
но не хватает мозгов, как правильно выделить буфер получателя исходя из динамической размерности исходного массива char.

Сами функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
bool AsciiToUnicode(const char* szAscii, wchar_t* szUnicode)
{
    if ((szUnicode == NULL) || (szAscii == NULL))
        return false;
    int len = strlen(szAscii);
    for (int i = 0; i < (len + 1); i ++)
        *szUnicode++ = static_cast<wchar_t> (*szAscii ++);
    return true;
}
 
BOOL AnsiToUnicode16(CHAR *in_Src, WCHAR *out_Dst, INT in_MaxLen)
{
    /* locals */
    INT lv_Len;
 
  // do NOT decrease maxlen for the eos
  if (in_MaxLen <= 0)
    return FALSE;
 
  // let windows find out the meaning of ansi
  // - the SrcLen=-1 triggers MBTWC to add a eos to Dst and fails if MaxLen is too small.
  // - if SrcLen is specified then no eos is added
  // - if (SrcLen+1) is specified then the eos IS added
  lv_Len = MultiByteToWideChar(CP_ACP, 0, in_Src, -1, out_Dst, in_MaxLen);
 
  // validate
  if (lv_Len < 0)
    lv_Len = 0;
 
  // ensure eos, watch out for a full buffersize
  // - if the buffer is full without an eos then clear the output like MBTWC does
  //   in case of too small outputbuffer
  // - unfortunately there is no way to let MBTWC return shortened strings,
  //   if the outputbuffer is too small then it fails completely
  if (lv_Len < in_MaxLen)
    out_Dst[lv_Len] = 0;
  else if (out_Dst[in_MaxLen-1])
    out_Dst[0] = 0;
 
  // done
  return TRUE;
}


Попутные вопросы оффтопом:

2) При попытке подключить библиотеку динамически (убрать все комментарии /**/ и #pragma comment) - получаю исключение (на скрине) нечто о несогласованности вызовов (строка № 62). Как будет правильно?
Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll
3) В упомянутой статье ничего не пишут о том, какая кодировка используется в CryptProtectData? По-умолчанию? Какая это?
4) В примере кода MSDN тип кодировки задается строкой:
C++
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
Но как она влияет на API функцию? Это изменение переменной окружения, которую функция потом считывает при вызове?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru