Мне нужно перейти с 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
Что я делаю не так?
Постскриптум Если я усекаю зашифрованный результат до нужного размера, а затем пытаюсь расшифровать его, расшифровка выполняется с возвращенным ожидаемым кодом ошибки, но данные расшифровываются правильно. но этот взлом не для меня …
Кажется, я нахожу временное решение.
Когда мне нужно зашифровать / расшифровать весь блок — все, что мне нужно, это ложь функции — «это не последний / единственный блок»:
Так что типа нет:
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, buffer, &d, (DWORD)bsize );
но:
result = CryptEncrypt( m_hAesKey, NULL, FALSE, 0, buffer, &d, (DWORD)bsize );
Теперь это работает. И надеюсь, что они не изменят концепцию заполнения данных в конце последней части, чтобы начать выравнивание в начале блока …
Других решений пока нет …