Я пытаюсь зашифровать/дешифровать данные с помощью AES 128 бит с нулевым заполнением. Я могу зашифровать/расшифровать нормально, если я не пытаться futz с режимом заполнения (по умолчанию PKCS5_PADDING), так что следующий фрагмент кода, чтобы показать, где вещи ломаются:CAPI AES: Почему CryptSetKeyParam возвращает NTE_BAD_DATA (0x80090005)
// sanity check -- is key configured how I expect?
CryptGetKeyParam(hKey, KP_KEYLEN, temp, &tempSz, 0);
CryptGetKeyParam(hKey, KP_ALGID, temp, &tempSz, 0);
CryptGetKeyParam(hKey, KP_MODE, temp, &tempSz, 0);
CryptGetKeyParam(hKey, KP_PADDING, temp, &tempSz, 0);
// force padding to zero padding
DWORD padding = ZERO_PADDING;
CryptSetKeyParam(hKey, KP_PADDING, (PBYTE)&padding, 0);
каждый из запросов работает без проблем со значениями: 128, 0x0000660e (CALG_AES_128), 1 (CRYPT_MODE_CBC) и 1 (PKCS5_PADDING) - это состояние по умолчанию.
затем я пытаюсь установить дополнение к ZERO_PADDING (3), и функция возвращает FALSE с последней ошибкой NTE_BAD_DATA. Я попытался, хихикая, установить его в PKCS5_PADDING - без ошибок. RANDOM_PADDING: ошибка.
поиск в interwebs как я мог бы, я не могу найти документацию, чтобы предположить, почему смена дополнения должна завершиться неудачно (даже некоторые примечания, говорящие только о PKCS5_PADDING, разрешены для определенных ключевых алгоритмов).
есть ли у кого-нибудь советы?
Какой поставщик услуг вы используете? –
MS_ENH_RSA_AES_PROV – rguilbault
Обратите внимание, что нулевое заполнение не работает, если последний байт входных данных равен нулю (0x00). Примечание. Когда вы видите PKCS # 5 для дополнения AES, документы не обновлялись, AES требует заполнения PKCS # 7, но хорошей новостью является то, что из-за реальных реализаций PKCS # 5 также поддерживает PKCS # 7. – zaph