2016-07-07 6 views
3

Я пытаюсь понять параметры следующей функции в библиотеке криптовальной среды openSSL.Детали параметров OpenSSL's AES_ctr128_encrypt()

void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, 
    size_t length, const AES_KEY *key, 
    unsigned char ivec[AES_BLOCK_SIZE], 
    unsigned char ecount_buf[AES_BLOCK_SIZE], 
    unsigned int *num); 

Проработав предложения данных here я был в состоянии выяснить:

*in - is the buffer in. 
*out - is the buffer out. 
length - is the the length of the *in buffer. 
*key - is the private key. 
ivec[0-7] - is the random IV 
ivec[8-15] - is the counter thats incremented for every block that's encrypted. 

Я не уверен, о параметрах ecount_buf и num.

Я вижу, что num установлен на length % AES_BLOCK_SIZE после вызова.

Любые указатели на какой параметр ecount_buf предназначен для?

+1

Вы должны * не * использовать 'AES_encrypt' и друзей. Это программная реализация, поэтому вам не понравится аппаратная поддержка, например AES-NI. Вы должны использовать 'EVP_ *' функции. См. [Симметричное шифрование и дешифрование EVP] (http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption) в вики OpenSSL. Фактически, вы, вероятно, должны использовать аутентифицированное шифрование, поскольку оно обеспечивает * и * конфиденциальность и аутентичность. См. [EVP Authenticated Encryption and Decryption] (http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption) в вики OpenSSL. – jww

ответ

1

Если вы посмотрите на код реализации взятого из here:

/* The input encrypted as though 128bit counter mode is being 
* used. The extra state information to record how much of the 
* 128bit block we have used is contained in *num, and the 
* encrypted counter is kept in ecount_buf. Both *num and 
* ecount_buf must be initialised with zeros before the first 
* call to AES_ctr128_encrypt(). 
*/ 
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out, 
    const unsigned long length, const AES_KEY *key, 
    unsigned char counter[AES_BLOCK_SIZE], 
    unsigned char ecount_buf[AES_BLOCK_SIZE], 
    unsigned int *num) { 

    unsigned int n; 
    unsigned long l=length; 

    assert(in && out && key && counter && num); 
    assert(*num < AES_BLOCK_SIZE); 

    n = *num; 

    while (l--) { 
     if (n == 0) { 
      AES_encrypt(counter, ecount_buf, key); 
      AES_ctr128_inc(counter); 
     } 
     *(out++) = *(in++)^ecount_buf[n]; 
     n = (n+1) % AES_BLOCK_SIZE; 
    } 

    *num=n; 
} 

можно вывести, что это промежуточный буфер для проведения е ncrypted граф эр. num содержит информацию о состоянии (в случае последующих вызовов, которые мы могли бы сделать для того, чтобы связать дополнительные данные) в виде количества байтов, используемых из общего размера блока.