1 | |||||||||||
Преобразовать тип данных char[] -> wchar -> BYTE для структуры DATA_BLOB crypt32.dll16.08.2013, 01:08. Показов 4254. Ответов 17
Метки нет (Все метки)
Помогите, пожалуйста, написать за меня:
1) преобразование аргумента ком. строки -> в Unicode (какой не знаю): пытаюсь перевести код, данный в статье: http://www.remkoweijnen.nl/blo... encrypted/ Нужно подставить в строки №№ 32, 57. Наработки
На MSDN и у большого Гугла нашел пару функций, но не хватает мозгов, как правильно выделить буфер получателя исходя из динамической размерности исходного массива char. Сами функции
Попутные вопросы оффтопом: 2) При попытке подключить библиотеку динамически (убрать все комментарии /**/ и #pragma comment) - получаю исключение (на скрине) нечто о несогласованности вызовов (строка № 62). Как будет правильно? 3) В упомянутой статье ничего не пишут о том, какая кодировка используется в CryptProtectData? По-умолчанию? Какая это? 4) В примере кода MSDN тип кодировки задается строкой: C++ #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
0
|
16.08.2013, 01:08 | |
Ответы с готовыми решениями:
17
Преобразовать WCHAR в CHAR в dll Нельзя преобразовать тип function(a: byte;b: byte): byte к integer (Списки) Восьмибитный тип переменной (что за тип, но не BYTE и не CHAR? Какой функцией можно преобразовать тип byte в тип string и наоборот? |
16.08.2013, 13:44 [ТС] | 3 | |||||
На вход - обычная строка (CP 866). Далее argv[1] -> Unicode -> BYTE -> кодирование через CryptProtectData. Получаем BYTE -> Hex строка на выход.
Я так понял. Добавлено через 7 минут Код из статьи
Delphi DataIn.pbData := Pointer(WideString(sPassword)); Вообщем совершенно запутался. Добавлено через 12 часов 21 минуту Актуально.
0
|
Ушел с форума
|
|
16.08.2013, 14:06 | 4 |
Можно так сделать: получить юникодную командную строку через GetCommandLineW,
затем распарсить ее при помощи CommandLineToArgvW, а затем первый аргумент подать на вход функции CryptProtectData. И не нужно ничего конвертировать.
1
|
Модератор
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
|
|
16.08.2013, 14:06 | 5 |
Хм, ну если нет встроенных функций, можно написать что-то свое.
Долгий путь - писать структуры с чарсетами разных кодировок, по ним же явным образом преобразовывать в байты.
0
|
16.08.2013, 14:28 [ТС] | 6 |
FraidZZ, зачем. Я ведь уже выложил в теме 2 функции.
Я хочу только, чтобы Вы показали как ними пользоваться. Я плохо в этом разбираюсь. Добавлено через 38 секунд Убежденный, спасибо. Потом попробую.
0
|
Модератор
5198 / 2080 / 406
Регистрация: 06.01.2013
Сообщений: 4,794
|
|
16.08.2013, 14:33 | 7 |
Тут ты преобразуешь указатель на const char в указатель на BYTE (я про твой код). Не знал, что оно будет работать 0_0. Или же я не прав. По-моему, нужно все-таки юзать какие-то функции преобразования wchar->BYTE. Но я не помню, какие, а справочника под рукой нет(
0
|
Ушел с форума
|
||||||
16.08.2013, 14:51 | 9 | |||||
Сообщение было отмечено как решение
Решение
Объявить функцию CryptProtectData как _stdcall, а не _cdecl.
Unicode. Конкретно - UTF-16 Little Endian. Windows давно уже юникодная "внутри", а UTF-16 LE - родная для нее кодировка. Никак. Эта строка в примере лишняя (видимо, перекочевала туда из другого примера). Добавлено через 2 минуты В общем, должно получиться нечто подобное: Кликните здесь для просмотра всего текста
0
|
16.08.2013, 15:37 [ТС] | 10 |
Убежденный, что-то здесь не так.
Программа всегда возвращает разный 16-ричный вывод для одной и той же фразы. По коду спасибо. Справедливые, поучительные правки. Можно несколько вопросов? 1) Эти макроопределения на что влияют? Не вижу, чтобы они напрямую использовались. C++ throw_exc(char const *pFormat, ...) 3) L"psw" - это Unicode? Если нет, то как будет? Добавлено через 12 минут Ох, извините, у меня тоже вывод был разный. Спасибо за пример с юникодом. С шифрованием позже поразбираюсь.
0
|
Ушел с форума
|
|
16.08.2013, 15:47 | 11 |
Так и должно быть. CryptProtectData использует "соль" для шифрования, чтобы усложнить взлом.
Попробуйте добавить CryptUnprotectData - обратное преобразование будет выполнено без ошибок. Это определение целевой версии (в данном случае WinXP, она же NT 5.1). Можно сказать, что это защита от подключения объявлений функций, которые появились в более поздних версиях. Функция принимает переменное число аргументов. Будет так: "psw". Но CryptProtect(Unprotect)Data работают только с юникодом, другую строку им не подсунуть.
1
|
Ушел с форума
|
||||||||||||||||
16.08.2013, 17:24 | 13 | |||||||||||||||
castaway, посмотрите код по ссылке, которую давал Dragokas.
Там есть такой фрагмент:
Кстати, в мой код нужно внести поправку, чтобы не учитывался завершающий ноль. То есть, вместо:
1
|
16.08.2013, 17:47 | 14 | |||||
Как вариант.
2
|
Ушел с форума
|
|
16.08.2013, 17:56 | 16 |
Не по теме:
Хотя не могу спокойно смотреть на код, где нет дотошной обработки каждой возможной ошибки. Добавлено через 1 минуту Добавляет. Но в коде по ссылке, которую Вы давали в исходном сообщении, этот ноль не учитывается. Добавлено через 47 секунд Т.е. длина "secret" принимается равной 6 символов * 2 байта на символ = 12 байт.
0
|
castaway
|
16.08.2013, 17:57
#17
|
Не по теме: Убежденный, ошибок тут может быть ровно две.
0
|
16.08.2013, 18:18 [ТС] | 18 |
Убежденный, Понял. Т.е. можно было и самому сосчитать. Ясно. Попробовал без c_str(). wide string -> BYTE напрямую не умеет. Теперь понятно зачем это.
0
|
16.08.2013, 18:18 | |
16.08.2013, 18:18 | |
Помогаю со студенческими работами здесь
18
Тип byte и char Почему byte можно преобразовать явно в char? Преобразовать тип byte в short Нельзя преобразовать тип set of char к char Как преобразовать тип byte[] в string Не удаётся неявно преобразовать тип string в byte[] Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |