Страницы:Кликните, чтобы указать произвольную страницуназад12
PRODIGY: BCryptEncrypt() ошибка STATUS_INVALID_PARAMETER = C000000d
Lucy
Member
297/20050 ответов
18 лет на iXBT, с июня 2006
Чаще пишет Р Р† "Юмор" (50%)
Португалия, Lisbon
Инфо Ответить
Lucy Member
4 года назад / 25 июня 2021 16:25
PRODIGY

На данный момент код такой
001NTSTATUS bcryptResult = 0;
002DWORD bytesDone = 0;
003 
004// This gets us the AES algorithm:
005BCRYPT_ALG_HANDLE algHandle = 0;
006bcryptResult = BCryptOpenAlgorithmProvider(&algHandle, BCRYPT_AES_ALGORITHM, 0, 0);
007assert(BCRYPT_SUCCESS(bcryptResult) || !"BCryptOpenAlgorithmProvider");
008 
009// This sets up the GCM chaining mode:
010bcryptResult = BCryptSetProperty(algHandle, BCRYPT_CHAINING_MODE, (BYTE*)BCRYPT_CHAIN_MODE_GCM, sizeof(BCRYPT_CHAIN_MODE_GCM), 0);
011assert(BCRYPT_SUCCESS(bcryptResult) || !"BCryptSetProperty(BCRYPT_CHAINING_MODE)");
012 
013 
014UCHAR ivRandom[12];
015ULONG ivRandomSize = 12;
016bcryptResult = BCryptGenRandom(0, ivRandom, ivRandomSize, BCRYPT_USE_SYSTEM_PREFERRED_RNG);
017assert(BCRYPT_SUCCESS(bcryptResult) || !"BCryptGenRandom");
018 
019UCHAR keyRandom[32];
020ULONG keyRandomSize = 32;
021bcryptResult = BCryptGenRandom(0, keyRandom, keyRandomSize, BCRYPT_USE_SYSTEM_PREFERRED_RNG);
022assert(BCRYPT_SUCCESS(bcryptResult) || !"BCryptGenRandom");
023 
024BCRYPT_KEY_HANDLE keyHandle = 0;
025bcryptResult = BCryptGenerateSymmetricKey(algHandle, &keyHandle, 0, 0, keyRandom, keyRandomSize, 0);
026assert(BCRYPT_SUCCESS(bcryptResult) || !"BCryptGenerateSymmetricKey");
027 
028 
029UCHAR namebuff[256];
030ULONG tempSize = 256; // We ignore this because we know the buffer is big enough.
031const WCHAR* name = (const WCHAR*)namebuff;
032bcryptResult = BCryptGetProperty(algHandle, BCRYPT_ALGORITHM_NAME, namebuff, sizeof(namebuff), &tempSize, 0);
033std::cout << "Obtained algorithm name: ";
034std::wcout << name << std::endl;
035 
036bcryptResult = BCryptGetProperty(algHandle, BCRYPT_CHAINING_MODE, namebuff, sizeof(namebuff), &tempSize, 0);
037std::cout << "Obtained chaining mode: ";
038std::wcout << name << std::endl; // Outputs: ChainingModeGCM
039 
040const size_t GCM_NONCE_SIZE = 12;
041const std::vector<BYTE> origNonce = { 0,0,0,0,0,0,0,0,0,0,0,0 };
042 
043std::cout << "Nonce: ";
044printB64((BYTE*)&origNonce[0], origNonce.size());
045 
046// This needs to be a multiple of the block size (128 bits/16 bytes) for Windows CNG. Our example is 128 bytes in ASCII (16 * 8 = 128)
047std::string plaintext("ABSDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567809AB");
048const std::vector<BYTE> plaintextVector(plaintext.data(), plaintext.data() + plaintext.length());
049 
050 
051// This tells us the length of the authentication tag:
052BCRYPT_AUTH_TAG_LENGTHS_STRUCT authTagLengths;
053bcryptResult = BCryptGetProperty(algHandle, BCRYPT_AUTH_TAG_LENGTH, (BYTE*)&authTagLengths, sizeof(authTagLengths), &bytesDone, 0);
054assert(BCRYPT_SUCCESS(bcryptResult) || !"BCryptGetProperty(BCRYPT_AUTH_TAG_LENGTH)");
055 
056std::cout << "Auth Tag Length (min): " << authTagLengths.dwMinLength << std::endl;
057std::cout << "Auth Tag Length (max): " << authTagLengths.dwMaxLength << std::endl;
058 
059// We are going to do in-place encryption:
060std::vector<BYTE> buff = plaintextVector;
061std::vector<BYTE> authTag(authTagLengths.dwMaxLength);
062std::string text = "Prodigy12345";
063std::vector<BYTE> authDataProdigy(text.data(), text.data() + text.length());
064 
065 
066// This sets up our nonce and GCM authentication tag parameters:
067BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO authInfo;
068BCRYPT_INIT_AUTH_MODE_INFO(authInfo);
069authInfo.pbNonce = (PUCHAR)&origNonce[0];
070authInfo.cbNonce = origNonce.size();
071authInfo.pbTag = &authTag[0];
072authInfo.cbTag = authTag.size();
073authInfo.pbAuthData = &authDataProdigy[0];
074authInfo.cbAuthData = authDataProdigy.size();
075 
076std::cout << "Plaintext (" << plaintext.length() << " bytes): " << plaintext << std::endl;
077 
078bcryptResult = BCryptEncrypt(
079    keyHandle,
080    &buff[0], buff.size(),
081    &authInfo,
082    (PUCHAR)&ivRandom[0], 12,
083    &buff[0], buff.size(),
084    &bytesDone, 0
085);
086 
087std::cout << "AES-128/GCM(16) ciphertext: ";
088printB64((BYTE*)&buff[0], buff.size());
089 
090std::cout << "Auth Tag: ";
091printB64((BYTE*)&authTag[0], authTag.size());
092 
093assert(BCRYPT_SUCCESS(bcryptResult) || !"BCryptEncrypt");
094assert(bytesDone == buff.size());
095 
096// Cleanup
097BCryptDestroyKey(keyHandle);
098BCryptCloseAlgorithmProvider(algHandle, 0);
099 
100std::getchar();

Добавление от 25.06.2021 16:13:

PRODIGY
Если Вы заметили, там написано, что buff должен быть по длине кратен 16bytes=block size, Вам vertur это в самом начале указывал.
Какой он у Вас?

Добавление от 25.06.2021 16:20:

PRODIGY
если не трудно, прикрепите рабочий файл, который вы скомпилировали - я его в отладчике прогоню.

Я на ассемблере не программирую
Могу прикрепить проект на с++

Windows 10, но пока никаких pa3личий с Вашими данными не вижу
Размер структуры 64

Добавление от 25.06.2021 16:25:

PRODIGY
Я всё больше склоняюсь к тому, что на моей Win7.1 х32 шифрование AES/GCM просто не реализовано, поскольку даже в хидерах Win8 нет режима "BCRYPT_CHAIN_MODE_GCM"

Согласно документации, этот флаг уже с Vista просто игнорируется

Исправлено: Lucy, 25.06.2021 17:51

К сообщению приложены файлы:
Lucy
Member
298/20051 ответов
18 лет на iXBT, с июня 2006
Чаще пишет Р Р† "Юмор" (50%)
Португалия, Lisbon
Инфо Ответить
Lucy Member
4 года назад / 25 июня 2021 17:46
PRODIGY
Чтобы уж наверняка опробовать все варианты, я даже написал такой макрос для инициализации этой структуры. Если посмотреть в отладчике, то он отрабатывает правильно - очищает всё, устанавливает в первом поле значение 38h, и во-втором версию 1. Однако профита (для кода) от него нет:

В документации написано, что не надо заполнять вручную размер структуры и версию.

cbSize

The size, in bytes, of this structure. Do not set this field directly. Use the BCRYPT_INIT_AUTH_MODE_INFO macro instead.

dwInfoVersion

The version number of the structure. The only supported value is BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO_VERSION. Do not set this field directly. Use the BCRYPT_INIT_AUTH_MODE_INFO macro instead.
Я вижу, Вы это макро и использовали

Исправлено: Lucy, 25.06.2021 18:12

PRODIGY
Member
Автор темы
25/37 ответов
7 лет на iXBT, с августа 2017
Инфо Ответить
P
PRODIGY MemberАвтор темы
4 года назад / 25 июня 2021 18:23
Lucy

Размер структуры 64
Вот оказывается в чём была проблема!
Если посчитать все поля этой структуры, то выходит 56 байт, а у вас макрос вычислил её как 64 байта. Я просто добавил в хвост своей структуры ещё 8-байт, и функция вернула ОК! Теперь всё шифрует как положено. Не обязательно вводить пароль кратный блоку AES, можно хоть один символ.

Входной (и он-же выходной) буфер у меня "резиновый" до конца секции-данных и его размер нигде не указываю. Функции BCryptEncrypt() передаю только длину ввода "passLen". В своём коде я ещё и хэширую пароль алгоритмом SHA-256 и результат выглядит так:

665x360, 9.6Kb
Lucy
Member
299/20057 ответов
18 лет на iXBT, с июня 2006
Чаще пишет Р Р† "Юмор" (50%)
Португалия, Lisbon
Инфо Ответить
Lucy Member
4 года назад / 25 июня 2021 18:29
PRODIGY
Если посчитать все поля этой структуры, то выходит 56 байт, а у вас макрос вычислил её как 64 байта. Я просто добавил в хвост своей структуры ещё 8-байт, и функция вернула ОК!

Да, функция возвращает ОК даже если прописать бОльший, чем нужно, размер.
А если размер меньше - сразу получаем 0xC000000D

Добавление от 25.06.2021 18:29:

PRODIGY
Не обязательно вводить пароль кратный блоку AES, можно хоть один символ.

Тоже заметила, хотя по документации не должно работать
PRODIGY
Member
Автор темы
26/38 ответов
7 лет на iXBT, с августа 2017
Инфо Ответить
P
PRODIGY MemberАвтор темы
4 года назад / 25 июня 2021 18:31
Проблему решил, и хотел-бы поблагодарить Вас и vertur.
Самостоятельно я точно не справился-бы. Снимаю шляпу..
Lucy
Member
300/20058 ответов
18 лет на iXBT, с июня 2006
Чаще пишет Р Р† "Юмор" (50%)
Португалия, Lisbon
Инфо Ответить
Lucy Member
4 года назад / 25 июня 2021 18:34
PRODIGY
Самостоятельно я точно не справился-бы. Снимаю шляпу..

Справились бы
Ваш ответ:

Нет значка Нет значка Р’РѕС‚ тут! Лампочка Восклицание Р’РѕРїСЂРѕСЃ Класс! Улыбка Злость Огорчение РџРѕРіРѕРІРѕСЂРёРј? Краснею Подмигивание Ругаю РћРґРѕР±СЂСЏСЋBIUdelSxsupxsuboffsp spoilerqurlimgvideo• list1. list1 codeprecenter-hr-rusQWE→ЙЦУ
файлыочистить
Ваше имя: Авторизуйтесь Предпросмотр В полную форму
вставить выделенную цитату в окно ответа
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Страницы:Кликните, чтобы указать произвольную страницуназад12
Последние обсуждения в Конференции
23:40Виски (ранее: Сорта шотландского виски. Личные впечатления. Просьба дополнять и задавать вопросы.) Кулинария
23:40Adobe Premiere Pro - удобный редактор видео. Видеозахват
23:39Посвящается Alexij_Niconow. Кто таков и с чем его едят? Флуд
23:39Vision Pro - VR гарнитура от Apple MacLife
23:39Отечественные сериалы: обсуждаем, отслеживаем премьеры Кино
23:39Будет ли война России с Украиной? Политика
23:39Intel Atom и "все все все" Тех. поддержка
23:39Как вы относитесь к обязательной платной диагностике в мастерских?! Рынок
23:38Иммиграция. Как выжить за рубежом? Общий
23:36Расскажите кстати анекдот (только ржачный, не про Вовочку и не про Штирлица) Юмор
23:33iXBT.photo в 2025-м году планируется закрыть. Просим перенести все свои фотографии на другие ресурсы как можно раньше (ранее: мелкие советы и предложения по улучшению фотогалереи) iXBT.com
23:31HP ProLiant MicroServer: почти готовое решение для домашнего сервера НАС
23:30S.T.A.L.K.E.R. 2 - теперь официально Игры
23:29Выбор эллиптического тренажера. Спорт
23:27AMD vs Intel: что лучше? Тестируем, сравниваем. Приветствуется технический анализ. Процессоры
23:26Телевизоры TCL - информация и опыт использования ДК TV
23:24Всё о сабвуферах ДК аудио
23:19ИИ - осознание себя? ИИ
23:18Строительство частного дома. Из чего , почем, где и зачем ? Ремонт
23:14Выбор качественного сетевого фильтра с базовым функционалом Корпуса, БП
Последние темы без ответов
вчераBattlefield 2042 drweb Игры
вчераМышь лагает и плавает при запуске любого приложения Тех. поддержка
вчераLLM Qwen – возможности, опыт использования, ограничения ИИ
вчераНе могу прошить UUID на материнской плате ASRock H55M-LE ни с помощью amidedos ни ее версии под Windows - осталось только слить дамп биоса, редактировать в HEX-редакторе и шить обратно? Тех. поддержка
2 дня[Решено] Установил и успешно запустил пакет motion под OpenWRT, но не могу зайти на его админку и получить видеопоток с помощью VLC-плеера Unix
2 дняDenon dcd-3000 ремонт Стерео
4 дняThecus 4560/2520 поиск прошивки. НАС
4 дняИИ-агенты - что, зачем, как... ИИ
давноКуплю мини/микро ATX компьютер KOMOK
давноCounter-Strike экранизация Кино
23:31Renault может вернуться в Россию, но свой завод, на котором сейчас выпускают «Москвичи», точно не получит
23:29Ключевой модуль лунной станции Gateway готовится к финальному путешествию через Атлантику перед стартом к Луне
23:22Космический аппарат Tianwen-2 прибыл на космодром Сичан для подготовки ко встрече с астероидом и кометой
23:06iPhone 16E оказался не только дороже, чем ожидалось, но и слабее. Его GPU урезан относительно iPhone 16
23:03Физики научились «видеть» движение электронов в молекулах
22:40Сингапурские учёные синтезировали сверхпрочный материал, который в восемь раз превзошёл прочность графена
22:35GeForce RTX 5070 и RTX 5060 тоже не будут доступны с нормальными ценами? У Nvidia какие-то проблемы с чипами, и массовое производство сдвигается
22:34«Пользы от нее очень мало». Илон Маск заявил о бесполезности Международной космической станции и позвал на Марс
22:32Астрономы обнаружили древние «пушистые звёздные ясли», меняющие теорию формирования звёзд
22:25В шаровом скоплении NGC 6093 обнаружен уникальный двойной пульсар с необычной орбитой
20+ лет назад в этот день обсуждали
2002Требуется максимально устойчивая связь Дом.интернет
2003Не перекачиваются фотки с Nikon Coolpix 4500 Фото
2003Нельзя загрузить с NTFS, если он второй primary OС и сист. ПО
2003AverMedia TVPhone и аналоговая камера Видеозахват
2003Ребят,а помогите выбрать серверный Big-Tower с хорошим охалждением винтов Корпуса, БП
2003Навигация в новостях iXBT iXBT.com
2004Можно ли инфу спасти после проделок "Partition Magic"? Посмотрите фотку Накопители
2004Canon i250 глюк которій не проходит по гарантии. Периферия
2004Как навеки спарить КПК и два (или более) PC через один USB-Bluetooth донгл? Планшеты
2005не пойму пример составления балансового отчета Общий