Неправильные результаты шифрования для AES128 / ECB (OpenSSL и WinCrypt)

Я пытаюсь зашифровать текстовый блок с помощью AES128 (режим ECB), чтобы проверить полученные функции шифрования / дешифрования, которые я использую с помощью тестовых векторов ECB-AES123 из «Рекомендация о режимах работы блочного шифра: методы и методы, специальная публикация NIST 800-38A, издание 2001 года;».

Например:

Key: 2b7e151628aed2a6abf7158809cf4f3c  (16 bytes)
Input Plaintext: 6bc1bee22e409f96e93d7e117393172a  (16 bytes)
Resulted Ciphertext: 3ad77bb40d7a3660a89ecaf32466ef97  (16 bytes)

Для OpenSSL отлично работает следующий код:

AES_KEY aes_key;
//key vector of bytes 2b7e151628aed2a6abf7158809cf4f3c (16 bytes)
//input_vector also vector of bytes 6bc1bee22e409f96e93d7e117393172a  (16 bytes)
if ( AES_set_encrypt_key( &key[0], 128, &aes_key ) != 0 )
{
return false;
}
AES_ecb_encrypt( &input_vector[ 0 ], &encrypted_vector[ 0 ], &aes_key, AES_ENCRYPT );
//encrypted_vector will have expected value 3ad77bb40d7a3660a89ecaf32466ef97 (16 bytes)

Но в то же время мне нужно реализовать ту же функциональность с Crypto API от Microsoft. Ниже приведен код, который должен это сделать:

HCRYPTPROV crypto_provider_handle;
HCRYPTHASH crypto_hash_handle;
HCRYPTKEY crypto_key_handle;

CryptAcquireContext( &crypto_provider_handle, NULL, MS_ENH_RSA_AES_PROV, PROV_RSA_AES,
CRYPT_VERIFYCONTEXT | CRYPT_NEWKEYSET );
CryptCreateHash( crypto_provider_handle, CALG_SHA1, 0, 0, &crypto_hash_handle );
CryptHashData( crypto_hash_handle, &key[ 0 ], key.size( ), 0 );
CryptDeriveKey( crypto_provider_handle, CALG_AES_128, crypto_hash_handle,
0x00800000 | CRYPT_NO_SALT, crypto_key_handle );

// Set ECB mode
DWORD mode = CRYPT_MODE_ECB;
CryptSetKeyParam( crypto_key_handle, KP_MODE, (BYTE*)&mode, 0 );

// input_data is buffer of 16 bytes with additional space, total size 16*2
// input_size equals 16
CryptEncrypt( crypto_key_handle, NULL, TRUE, 0, input_data, &input_size, 16*2 );

Но этот код даст другой результат.

  1. Если «Final» будет TRUE (как было показано выше), input_data будет иметь
    размер 32 байта, что совсем не соответствует ожидаемому значению. Согласно
    к MSDN все нормально, так как в этом случае один дополнительный блок заполнения
    добавляется к данным.
  2. Если «Final» будет FALSE, input_data будет иметь ожидаемый размер (16 байт), но также неверный результат.

Я застрял в этом деле, и я не понимаю, что я пропустил.
Можно ли получить тот же результат, что и OpenSSL (что ожидается в соответствии со спецификациями)? Почему AES128 в режиме ECB меняет размер результата (в режиме ECB этого делать не следует)?

1

Решение

Задача ещё не решена.

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


По вопросам рекламы [email protected]