2016-01-14 7 views
0

Я пытаюсь зашифровать/дешифровать данные с помощью 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, разрешены для определенных ключевых алгоритмов).

есть ли у кого-нибудь советы?

+0

Какой поставщик услуг вы используете? –

+0

MS_ENH_RSA_AES_PROV – rguilbault

+0

Обратите внимание, что нулевое заполнение не работает, если последний байт входных данных равен нулю (0x00). Примечание. Когда вы видите PKCS # 5 для дополнения AES, документы не обновлялись, AES требует заполнения PKCS # 7, но хорошей новостью является то, что из-за реальных реализаций PKCS # 5 также поддерживает PKCS # 7. – zaph

ответ

2

Поставщики криптографических услуг, предоставленные Microsoft, поддерживают только PKCS5_PADDING.

См. https://msdn.microsoft.com/en-us/library/windows/desktop/aa380272(v=vs.85).aspx для справки; поиск по KP_PADDING.

+0

grr .... Я читал и перечитывал этот документ столько раз. полностью пропустил линию, по которой он не поддерживается провайдерами MS. – rguilbault