Я пытаюсь зашифровать текстовый блок с помощью 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 );
Но этот код даст другой результат.
Я застрял в этом деле, и я не понимаю, что я пропустил.
Можно ли получить тот же результат, что и OpenSSL (что ожидается в соответствии со спецификациями)? Почему AES128 в режиме ECB меняет размер результата (в режиме ECB этого делать не следует)?
Задача ещё не решена.