Windows CryptoAPI блок симметричного кодирования / декодирования, который уже выравнивается

Мне нужно перейти с OpenSSL на MS CryptoAPI.

Когда я использую OpenSSL, я получаю N байтов (уже выровненных — например, допустим, длина данных = 32 байта) данных и кодирую / декодирую их из одного буфера в другой. Все работает отлично.

Теперь я должен «использовать CryptoAPI!».
Поэтому я пишу что-то вроде:

    // Import AES key
if(!CryptImportKey(m_hProvider, (CONST BYTE*)&aeskey, structsize, NULL, 0, &m_hAesKey ) ) {
throw WinAESException("SetKey: Import key failed");
}

// Set Mode
DWORD dwMode = CRYPT_MODE_ECB; //I can also use CRYPT_MODE_CBC with set of IV but let simple the code;
if(!CryptSetKeyParam(m_hAesKey, KP_MODE, (BYTE*)&dwMode, 0)) {
throw WinAESException("SetKey: Set ECB mode failed");
}

Это работает хорошо,
и теперь я пытаюсь закодировать данные

    DWORD d = (DWORD)psize;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, buffer, &d, (DWORD)bsize );

И что я вижу? Кодированная часть данных больше источника.
Я так понимаю, что функция CryptEncrypt как-то дополняет уже заполненные данные?

Возможно ли, во всяком случае, получить кодированный результат того же размера, что и обычные данные?

Я не использую невыровненный блок, я хочу, чтобы при шифровании 32 байта получалось ровно 32 байта, а не 48 …

Когда я проверяю ожидаемый размер

    DWORD d = 16;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize );  //need 32

d = 32;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize );  //need 48

d = 48;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize );   //need 64

d = 64;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize );  //need 80

Что я делаю не так?
Постскриптум Если я усекаю зашифрованный результат до нужного размера, а затем пытаюсь расшифровать его, расшифровка выполняется с возвращенным ожидаемым кодом ошибки, но данные расшифровываются правильно. но этот взлом не для меня …

0

Решение

Кажется, я нахожу временное решение.
Когда мне нужно зашифровать / расшифровать весь блок — все, что мне нужно, это ложь функции — «это не последний / единственный блок»:
Так что типа нет:

result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, buffer, &d, (DWORD)bsize );

но:

result = CryptEncrypt( m_hAesKey, NULL, FALSE, 0, buffer, &d, (DWORD)bsize );

Теперь это работает. И надеюсь, что они не изменят концепцию заполнения данных в конце последней части, чтобы начать выравнивание в начале блока …

-1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector