2016-07-07 24 views
3

Ich versuche, die Parameter der folgenden Funktion in openSSL Crypto-Bibliothek zu verstehen.Parameterdetails von OpenSSL 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); 

von durch die here ich war in der Lage, um herauszufinden, gegeben Vorschläge arbeiten:

*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. 

Ich bin nicht sicher über die ecount_buf und num Parameter.

Ich sehe, dass num-length % AES_BLOCK_SIZE nach dem Aufruf zurückkehrt gesetzt.

Irgendwelche Hinweise darauf, was der ecount_buf Parameter ist?

+1

Sie sollten 'AES_encrypt' und Freunde * nicht * benutzen. Das ist eine reine Software-Implementierung, so dass Sie keine Hardware-Unterstützung wie AES-NI genießen werden. Sie sollten 'EVP_ *' Funktionen verwenden. Siehe [Symmetrische Verschlüsselung und Entschlüsselung von EVP] (http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption) im OpenSSL-Wiki. Tatsächlich sollten Sie eine authentifizierte Verschlüsselung verwenden, da sie * sowohl * Vertraulichkeit als auch Authentizität bietet. Siehe [Authentifizierte Verschlüsselung und Entschlüsselung mit EVP] (http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption) im OpenSSL-Wiki. – jww

Antwort

1

Wenn man sich die Code-Implementierung von here genommen:

/* 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; 
} 

Sie können ableiten, dass es einen Zwischenpuffer zum Halten der e NCrypted Zählung er. num enthält die Statusinformationen (im Fall von nachfolgenden Aufrufen, die wir vornehmen können, um zusätzliche Daten zu verketten) in Form der Anzahl der Bytes, die von der gesamten Blockgröße verwendet werden.