2016-05-28 10 views
0

Ich habe eine Größe von 1MB Größe und möchte mit aes_128_ctr verschlüsseln. Ich habe den Quellcode in openssl wie folgt gefunden.openssl aes_128_ctr in c

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

Meine Frage ist: Um den gesamten 1MB Daten zu verschlüsseln, muss ich eine while-Schleife verwenden, jede 128-Bit zu verschlüsseln? Kann ich diese Funktion nur einmal aufrufen, indem ich die Länge als (1024 * 1024/16) festlege? Und ich verstehe nicht, was diese * num machen. Kann mir jemand das erklären?

+0

Sie müssen die Verschlüsselungsfunktion mehrmals aufrufen, um alle Daten zu verschlüsseln, aber Sie müssen ctr_state struct nur einmal initialisieren, was von der Verschlüsselungsfunktion verwendet wird. Der Parameter num ist ein Zeiger, der auf das Element num der ctr_state-Struktur zeigt: & state-> num. Vielleicht [http://stackoverflow.com/questions/3141860/aes-ctr-256-encryption-mode-of-operation-on-openssl/3146214#3146214) Antwort wird Ihnen helfen. – Linus

+0

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

+0

Möglicherweise verwandt: [AES CTR 256 Encryption-Betriebsmodus unter OpenSSL] (http://stackoverflow.com/q/3141860/608639) (oder zumindest ein Verweis, der bereits auf Stack Overflow zur Verfügung gestellt wurde). Siehe auch [Ist es möglich, den AES CTR-Modus mit der EVP-API zu verschlüsseln] (http://stackoverflow.com/q/3783311). – jww

Antwort

1

Sie können es auf einmal tun. Initialisieren Sie also zunächst die AES_KEY key (für die Verschlüsselung) und vor der Verschlüsselung memset(ecount_buf,0,AES_BLOCK_SIZE);unsigned int num=0; und füllen Sie den Zählerpuffer mit dem Zählerwert für Ihre Datei.

nennen Dann AES_ctr128_encrypt(in,out,length, &key,counter,ecount_buf,&num); length wo die Länge so 1024 * 1024 in Bytes.

Wenn Sie Daten später an die Datei anhängen, können Sie nach diesem Aufruf mit dem Wert counter, ecount_buf Wert und num fortfahren. Diese Werte werden alle während der inneren Funktion der Funktion geändert.

Sie werden benötigt, denn wenn Sie 15 Bytes im Zählermodus verschlüsseln und später noch 15 weitere hinzufügen möchten, benötigen Sie immer noch den verschlüsselten Zählerwert, der für die ersten 15 Bytes verwendet wird, um das 16. Byte zu verschlüsseln Block ist noch nicht aufgebraucht), so nach der ersten Verschlüsselung num wäre 15, um dies zu verfolgen. Dann wird der Zähler aktualisiert, auf einen neuen Wert verschlüsselt und für die nächsten 14 Bytes verwendet, und num wird 14, usw. Wenn Sie niemals Daten an die Datei anhängen werden, also out bereit ist, dann setzen Sie einfach num auf Null , count_buffer und counter nach dem verschlüsselten Anruf, und vergessen Sie sie.

Es könnte weniger verwirrend sein, stattdessen die EVP-Schnittstelle zu den Algorithmen zu verwenden, die diese Dinge in ihrem eigenen Kontext verfolgen (siehe in evp.h).