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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Dragokas
Автор FAQ
 Аватар для Dragokas
14512 / 6339 / 783
Регистрация: 25.12.2011
Сообщений: 9,870
Записей в блоге: 14
16.08.2013, 01:08     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #1
Помогите, пожалуйста, написать за меня:
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 функцию? Это изменение переменной окружения, которую функция потом считывает при вызове?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.08.2013, 01:12     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #2
а cmd.exe умеет юникод?
Dragokas
Автор FAQ
 Аватар для Dragokas
14512 / 6339 / 783
Регистрация: 25.12.2011
Сообщений: 9,870
Записей в блоге: 14
16.08.2013, 13:44  [ТС]     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #3
На вход - обычная строка (CP 866). Далее argv[1] -> Unicode -> BYTE -> кодирование через CryptProtectData. Получаем BYTE -> Hex строка на выход.

Я так понял.

Добавлено через 7 минут
Код из статьи
Delphi
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
function CryptRDPPassword(sPassword: string): string; 
var DataIn: DATA_BLOB; 
    DataOut: DATA_BLOB; 
    pwDescription: PWideChar; 
    PwdHash: string; 
begin 
  PwdHash := '';                                      
 
  DataOut.cbData := 0; 
  DataOut.pbData := nil;                                      
 
  // RDP uses UniCode 
  DataIn.pbData := Pointer(WideString(sPassword)); 
  DataIn.cbData := Length(sPassword) * SizeOf(WChar);                                      
 
  // RDP always sets description to psw 
  pwDescription := WideString('psw');                                      
 
  if CryptProtectData(@DataIn, 
                      pwDescription, 
                      nil, 
                      nil, 
                      nil, 
                      CRYPTPROTECT_UI_FORBIDDEN,  // Never show interface 
                      @DataOut) then 
  begin 
    PwdHash := BlobDataToHexStr(DataOut.pbData, DataOut.cbData); 
  end; 
  Result := PwdHash;                                      
 
  // Cleanup 
  LocalFree(Cardinal(DataOut.pbData)); 
  LocalFree(Cardinal(DataIn.pbData));                                      
 
end;


Цитата Сообщение от Dragokas Посмотреть сообщение
Unicode -> BYTE
Delphi
DataIn.pbData := Pointer(WideString(sPassword));
или так: *Unicode

Вообщем совершенно запутался.

Добавлено через 12 часов 21 минуту
Актуально.
Убежденный
Системный программист
 Аватар для Убежденный
14184 / 6199 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
16.08.2013, 14:06     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #4
Можно так сделать: получить юникодную командную строку через GetCommandLineW,
затем распарсить ее при помощи CommandLineToArgvW, а затем первый аргумент
подать на вход функции CryptProtectData. И не нужно ничего конвертировать.
FraidZZ
Модератор
 Аватар для FraidZZ
3878 / 1504 / 227
Регистрация: 06.01.2013
Сообщений: 4,029
Завершенные тесты: 1
16.08.2013, 14:06     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #5
Хм, ну если нет встроенных функций, можно написать что-то свое.
Долгий путь - писать структуры с чарсетами разных кодировок, по ним же явным образом преобразовывать в байты.
Dragokas
Автор FAQ
 Аватар для Dragokas
14512 / 6339 / 783
Регистрация: 25.12.2011
Сообщений: 9,870
Записей в блоге: 14
16.08.2013, 14:28  [ТС]     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #6
FraidZZ, зачем. Я ведь уже выложил в теме 2 функции.
Я хочу только, чтобы Вы показали как ними пользоваться. Я плохо в этом разбираюсь.
Цитата Сообщение от Dragokas Посмотреть сообщение
как правильно выделить буфер получателя исходя из динамической размерности исходного массива char.
Добавлено через 38 секунд
Убежденный, спасибо. Потом попробую.
FraidZZ
Модератор
 Аватар для FraidZZ
3878 / 1504 / 227
Регистрация: 06.01.2013
Сообщений: 4,029
Завершенные тесты: 1
16.08.2013, 14:33     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #7
Цитата Сообщение от Dragokas Посмотреть сообщение
C++
1
BYTE *pbDataInput =(BYTE*)"secret";
Тут ты преобразуешь указатель на const char в указатель на BYTE (я про твой код). Не знал, что оно будет работать 0_0. Или же я не прав. По-моему, нужно все-таки юзать какие-то функции преобразования wchar->BYTE. Но я не помню, какие, а справочника под рукой нет(
Dragokas
Автор FAQ
 Аватар для Dragokas
14512 / 6339 / 783
Регистрация: 25.12.2011
Сообщений: 9,870
Записей в блоге: 14
16.08.2013, 14:35  [ТС]     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #8
FraidZZ, судя из того, что выдает DataVerify.pbData на выходе, это работает верно.

Можешь раскомментировать //BYTE *pbDataInput =(BYTE*)argv[1]; и проверить.
Убежденный
Системный программист
 Аватар для Убежденный
14184 / 6199 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
16.08.2013, 14:51     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Dragokas Посмотреть сообщение
При попытке подключить библиотеку динамически (убрать все комментарии /**/ и #pragma comment) - получаю исключение (на скрине) нечто о несогласованности вызовов (строка № 62). Как будет правильно?
Объявить функцию CryptProtectData как _stdcall, а не _cdecl.

Цитата Сообщение от Dragokas Посмотреть сообщение
В упомянутой статье ничего не пишут о том, какая кодировка используется в CryptProtectData? По-умолчанию? Какая это?
Unicode. Конкретно - UTF-16 Little Endian.
Windows давно уже юникодная "внутри", а UTF-16 LE - родная для нее кодировка.

Цитата Сообщение от Dragokas Посмотреть сообщение
В примере кода MSDN тип кодировки задается строкой:
C++
1
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
Но как она влияет на API функцию?
Никак. Эта строка в примере лишняя (видимо, перекочевала туда из другого примера).

Добавлено через 2 минуты
В общем, должно получиться нечто подобное:
Кликните здесь для просмотра всего текста

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
118
119
120
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_WINDOWS 0x0501
#define _WIN32_IE 0x0600
 
 
 
#include <iostream>
#include <string>
#include <Windows.h>
 
#include <WinCrypt.h>
#pragma comment(lib, "Crypt32.lib")
 
#include <strsafe.h>
 
 
 
namespace
{
 
 
 
void
_stdcall
throw_exc(char const *pFormat, ...)
{
    using namespace std;
 
    va_list VaList;
    va_start(VaList, pFormat);
 
    size_t const BuffSize = 1000;
    char *pBuffer = new char[BuffSize];
    string ErrMsg;
 
    if (FAILED(StringCchVPrintfA(pBuffer, BuffSize, pFormat, VaList)))
    {
        ErrMsg = pFormat;
    }
 
    else
    {
        ErrMsg = pBuffer;
    }
 
    delete [] pBuffer;
    throw (runtime_error(ErrMsg.c_str()));
}
 
 
 
} // namespace
 
 
 
int main()
{
    using namespace std;
 
    try
    {
        wchar_t *pCmdLine = GetCommandLineW();
 
        if (NULL == pCmdLine)
        {
            throw_exc("GetCommandLineW failed with last error %lu.", GetLastError());
        }
 
        int NumArgs;
        wchar_t **pArgsArray = CommandLineToArgvW(pCmdLine, &NumArgs);
 
        if (NULL == pArgsArray)
        {
            throw_exc("CommandLineToArgvW failed with last error %lu.", GetLastError());
        }
 
        if (2 != NumArgs)
        {
            LocalFree(pArgsArray);
            throw_exc("Wrong arguments number (%lu).", NumArgs);
        }
 
        wstring const Password = pArgsArray[1];
        LocalFree(pArgsArray);
 
        DATA_BLOB BlobIn;
        DATA_BLOB BlobOut;
        BlobIn.pbData = (BYTE *)Password.c_str();
        BlobIn.cbData = static_cast<DWORD>((Password.length() + 1) * sizeof (wchar_t));
 
        if (FALSE == CryptProtectData(&BlobIn,
            L"psw",
            NULL,
            NULL,
            NULL,
            CRYPTPROTECT_UI_FORBIDDEN,
            &BlobOut))
        {
            throw_exc("CryptProtectData failed with last error %lu.", GetLastError());
        }
 
        for (DWORD i = 0; i < BlobOut.cbData; ++i)
        {
            printf("%02X", BlobOut.pbData[i]);
        }
 
        printf("\r\n");
 
        LocalFree(BlobOut.pbData);
    }
 
    catch (exception const &Exc)
    {
        cerr << "ERROR: " << Exc.what() << endl;
        return EXIT_FAILURE;
    }
 
    return EXIT_SUCCESS;
}
Dragokas
Автор FAQ
 Аватар для Dragokas
14512 / 6339 / 783
Регистрация: 25.12.2011
Сообщений: 9,870
Записей в блоге: 14
16.08.2013, 15:37  [ТС]     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #10
Убежденный, что-то здесь не так.
Программа всегда возвращает разный 16-ричный вывод для одной и той же фразы.
В моем коде (без юникода) она выдавала всегда одинаковый.

По коду спасибо. Справедливые, поучительные правки.
Можно несколько вопросов?

Цитата Сообщение от Убежденный Посмотреть сообщение
C++
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
#define _WIN32_WINDOWS 0x0501
#define _WIN32_IE 0x0600
1) Эти макроопределения на что влияют? Не вижу, чтобы они напрямую использовались.

C++
throw_exc(char const *pFormat, ...)
2) Что означает "..." ?

3) L"psw" - это Unicode? Если нет, то как будет?

Добавлено через 12 минут
Ох, извините, у меня тоже вывод был разный.
Спасибо за пример с юникодом.
С шифрованием позже поразбираюсь.
Убежденный
Системный программист
 Аватар для Убежденный
14184 / 6199 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
16.08.2013, 15:47     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #11
Цитата Сообщение от Dragokas Посмотреть сообщение
Убежденный, что-то здесь не так.
Программа всегда возвращает разный 16-ричный вывод для одной и той же фразы.
Так и должно быть. CryptProtectData использует "соль" для шифрования, чтобы усложнить взлом.
Попробуйте добавить CryptUnprotectData - обратное преобразование будет выполнено без ошибок.

Цитата Сообщение от Dragokas Посмотреть сообщение
1) Эти макроопределения на что влияют? Не вижу, чтобы они напрямую использовались.
Это определение целевой версии (в данном случае WinXP, она же NT 5.1).
Можно сказать, что это защита от подключения объявлений функций, которые
появились в более поздних версиях.

Цитата Сообщение от Dragokas Посмотреть сообщение
2) Что означает "..." ?
Функция принимает переменное число аргументов.

Цитата Сообщение от Dragokas Посмотреть сообщение
3) L"psw" - это Unicode? Если нет, то как будет?
Будет так: "psw". Но CryptProtect(Unprotect)Data работают только с юникодом,
другую строку им не подсунуть.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 17:14     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #12
Я не совсем понимаю, а зачем в 32-й строке нужна именно Unicode-строка ? CryptProtectData этого не требует.
Убежденный
Системный программист
 Аватар для Убежденный
14184 / 6199 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
16.08.2013, 17:24     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #13
castaway, посмотрите код по ссылке, которую давал Dragokas.
Там есть такой фрагмент:
Delphi
1
2
3
// RDP uses UniCode
DataIn.pbData := Pointer(WideString(sPassword));
DataIn.cbData := Length(sPassword) * SizeOf(WChar);
Добавлено через 1 минуту
Кстати, в мой код нужно внести поправку, чтобы не учитывался завершающий ноль.
То есть, вместо:
C++
1
BlobIn.cbData = static_cast<DWORD>((Password.length() + 1) * sizeof (wchar_t));
сделать так:
C++
1
BlobIn.cbData = static_cast<DWORD>(Password.length() * sizeof (wchar_t));
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 17:47     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #14
Как вариант.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <windows.h>
#include <wincrypt.h>
#include <cstdio>
#include <cstdlib>
 
int main( int argc, char *argv[] )
{
    if ( argc != 2 ) return 1;
 
    DATA_BLOB DataIn;
    DATA_BLOB DataOut;
    wchar_t secret[256];
    DataIn.cbData = mbstowcs( secret, argv[1], 256 ) * sizeof( wchar_t );
    DataIn.pbData = (BYTE *)(&secret[0]);
    if ( CryptProtectData( &DataIn, L"psw", NULL, NULL, NULL, CRYPTPROTECT_UI_FORBIDDEN, &DataOut ) ) {
        for ( size_t i = 0; i < DataOut.cbData; i++ ) {
            fprintf( stderr, "%02x", DataOut.pbData[i] );
        }
    } else {
        printf( "CryptProtectData(): error\n" );
    }
    return 0;
}
Dragokas
Автор FAQ
 Аватар для Dragokas
14512 / 6339 / 783
Регистрация: 25.12.2011
Сообщений: 9,870
Записей в блоге: 14
16.08.2013, 17:52  [ТС]     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #15
Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
Кстати, в мой код нужно внести поправку, чтобы не учитывался завершающий ноль.
C++
1
BlobIn.pbData = (BYTE *)Password.c_str();
а здесь NULL обязателен? (метод c_str() его добавляет на сколько я понял)
Убежденный
Системный программист
 Аватар для Убежденный
14184 / 6199 / 984
Регистрация: 02.05.2013
Сообщений: 10,324
Завершенные тесты: 1
16.08.2013, 17:56     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #16

Не по теме:


Цитата Сообщение от castaway Посмотреть сообщение
Как вариант
...
Краткость - С.Т. Вот чего мне всегда не хватало.
Хотя не могу спокойно смотреть на код, где нет дотошной
обработки каждой возможной ошибки.



Добавлено через 1 минуту
Цитата Сообщение от Dragokas Посмотреть сообщение
а здесь NULL обязателен? (метод c_str() его добавляет на сколько я понял)
Добавляет.
Но в коде по ссылке, которую Вы давали в исходном сообщении, этот ноль не учитывается.

Добавлено через 47 секунд
Т.е. длина "secret" принимается равной 6 символов * 2 байта на символ = 12 байт.
castaway
16.08.2013, 17:57
  #17

Не по теме:

Убежденный, ошибок тут может быть ровно две.
1. недостаточный размер secret (обработать не составит труда)
2. ошибка возвращаемая функцией CryptProtectData (обработана)

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2013, 18:18     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll
Еще ссылки по теме:

Путаница с типами данных TCHAR и char. Какой тип данных выбрать? C++
C++ Std::fstream почему функция write принимает параметр char* а не unsigned char* (аля byte*) ?
Не могу преобразовать тип char в тип double C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dragokas
Автор FAQ
 Аватар для Dragokas
14512 / 6339 / 783
Регистрация: 25.12.2011
Сообщений: 9,870
Записей в блоге: 14
16.08.2013, 18:18  [ТС]     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll #18
mbstowcs Return Value
The number of wide characters written to dest, not including the eventual terminating null character.
castaway, спасибо. Как раз длину результирующего значения я и не знал откуда взять.

Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
Т.е. длина "secret" принимается равной 6 символов * 2 байта на символ = 12 байт.
Понял. Т.е. можно было и самому сосчитать.

Цитата Сообщение от Убежденный Посмотреть сообщение
Добавляет.
Но в коде по ссылке, которую Вы давали в исходном сообщении, этот ноль не учитывается.
Ясно. Попробовал без c_str(). wide string -> BYTE напрямую не умеет. Теперь понятно зачем это.
Yandex
Объявления
16.08.2013, 18:18     Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll
Ответ Создать тему
Опции темы

Текущее время: 07:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru