AES128 / ECB(OpenSSL和WinCrypt)的加密结果错误

时间:2015-05-02 10:26:30

标签: c++ encryption openssl aes wincrypt

我正在尝试使用AES128(ECB模式)加密文本块,以使用来自“https://developers.google.com/adwords/api/docs/test-accounts#developing_with_test_accounts”的ECB-AES123测试向量来测试我正在使用的加密/解密功能。

例如:

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)

但与此同时,我需要与Microsoft的Crypto API实现相同的功能。以下是应该执行此操作的代码:

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字节),但结果也是错误的。
  3. 我坚持这个案子,我不明白我错过了什么。 是否有可能产生与OpenSSL相同的结果(根据规格预期)?为什么ECB模式下的AES128会改变结果的大小(在ECB模式下它不应该这样做)?

0 个答案:

没有答案