2009-06-17 6 views
19

Ich möchte ein kleines Programm in C/C++ schreiben, das eine kleine Textdatei liest und sie mit einem "internen" Schlüssel verschlüsselt. Dann möchte ich noch ein kleines Programm schreiben, das die verschlüsselte Datei mit internem Schlüssel entschlüsseln kann.Verschlüsseln und Entschlüsseln einer kleinen Datei mit openssl

Ich schaute auf OpenSSL-Website und googelte aber fand nicht einfaches Beispiel, hat jemand jemals versucht, dieses Ding zu tun?

+0

Eine Frage mit ähnlichem Beispiel http://stackoverflow.com/questions/3141860/aes-ctr-256-encryption-mode-of- operation-on-openssl – enthusiasticgeek

+0

Sie sollten 'EVP_ *' Funktionen verwenden. Die 'EVP_ *' Funktionen verwenden Hardware, wie AES-NI (falls verfügbar). Siehe [Symmetrische Verschlüsselung und Entschlüsselung von EVP] (https://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] (https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption) im OpenSSL-Wiki. – jww

Antwort

0

OpenSSL befasst sich speziell mit der Implementierung von SSL und TLS, bei denen es sich um Protokolle zur Verschlüsselung von Daten über ein Netzwerk handelt. Da Sie nur versuchen, eine Datei zu verschlüsseln, ist es möglich, OpenSSL zu verwenden, aber nicht ideal.

Stattdessen würde ich etwas wie BeeCrypt oder Crypto++® Library 5.6.0 verwenden, die beide Beispiele für ihre Verwendung bieten.

+4

OpenSSL hat sowohl Speicher als auch Datei 'BIO's, die eine Abstraktion sind. Die Bibliothek ist in Ordnung mit Speicherpuffern, Dateipuffern, Sockets und anderen E/A-Objekten. Der Kryptographieteil der Bibliothek ("libcrypto.a") kann eigenständig verwendet werden; und der SSL-Teil ("libssl.a") ist auf der Kryptographie aufgebaut. – jww

20

Idealerweise können Sie ein vorhandenes Werkzeug wie ccrypt verwenden, aber hier gehen:

#include <openssl/aes.h> 

/* ... */ 


{ 
    int bytes_read, bytes_written; 
    unsigned char indata[AES_BLOCK_SIZE]; 
    unsigned char outdata[AES_BLOCK_SIZE]; 

    /* ckey and ivec are the two 128-bits keys necesary to 
    en- and recrypt your data. Note that ckey can be 
    192 or 256 bits as well */ 
    unsigned char ckey[] = "thiskeyisverybad"; 
    unsigned char ivec[] = "dontusethisinput"; 

    /* data structure that contains the key itself */ 
    AES_KEY key; 

    /* set the encryption key */ 
    AES_set_encrypt_key(ckey, 128, &key); 

    /* set where on the 128 bit encrypted block to begin encryption*/ 
    int num = 0; 

    while (1) { 
    bytes_read = fread(indata, 1, AES_BLOCK_SIZE, ifp); 

    AES_cfb128_encrypt(indata, outdata, bytes_read, &key, ivec, &num, 
      AES_ENCRYPT); 

    bytes_written = fwrite(outdata, 1, bytes_read, ofp); 
    if (bytes_read < AES_BLOCK_SIZE) 
    break; 
    } 
} 

Decryption durch den Aufruf AES_cfb128_encrypt mit AES_DECRYPT als letzten Parameter erfolgt. Beachten Sie, dass dieser Code nicht mehr als die grundlegendsten Tests erhalten hat und dass Sie richtige 8-Bit-Zufallsdaten für Schlüssel und IVEC verwenden sollten.

EDIT: Es scheint, AES_cfb128_encrypt Daten beliebiger Länge akzeptiert, so dass Sie nicht in Blöcken von AES_BLOCK_SIZE (16) Bytes verschlüsseln erforderlich.

+0

Einige Anweisungen von aes help doc: Nicht alle möglichen Variationen der Schlüsselgröße und der Betriebsmodi sind in dieser Bibliothek enthalten. Aus diesem Grund und anderen Anwendungen sollten Anwendungen die Funktionen auf höherer Ebene L usw. verwenden, anstatt die AES-Funktionen direkt aufzurufen. – solotim

+0

@Michiel Budding ': Ich habe Ihren Code verwendet und muss int num initialisieren; bis zur IVEC-Größe, damit es richtig funktioniert. – Macarse

+0

Ihr Code segfaults bigtime. – user99545

13

Frühere Antworten haben Sie darauf hingewiesen, wie Sie das tun können, wonach Sie gefragt haben.

Ich möchte ein Wort hinzufügen, warum Sie wahrscheinlich nicht tun sollten.

Sie sprechen von "symmetrischer Verschlüsselung" (derselbe Schlüssel wird zum Verschlüsseln und Entschlüsseln verwendet, im Gegensatz zur asymmetrischen Verschlüsselung, bei der alles, was mit einem Schlüssel verschlüsselt wurde, nur von einem bestimmten Gegenstück entschlüsselt werden kann).

Das Zerlegen einer ausführbaren Datei zur Bestimmung eines fest codierten Schlüssels ist neben-trivial. Das bedeutet, dass jeder, der jemals eines seiner ausführbaren Programme in die Hände bekommt, die Verschlüsselung aller jemals getauschten Nachrichten durchbrechen kann.

Sofern die Anwendung, die Sie im Sinn haben, sehr spezifisch ist, bedeutet dies, dass Ihr Setup sicher aussieht, aber nicht. In diesen Fällen ist es normalerweise besser, überhaupt nicht zu verschlüsseln, so dass niemand für dieses falsche Gefühl der Sicherheit fällt ...

Es ist sehr gut, dass Sie nach Standardbibliotheken suchen, um die Verschlüsselung zu tun (statt zu implementieren/Erstellen eines Algorithmus selbst), aber das Protokoll (Wie Anwendungen, Schlüssel und Nachrichten verwendet und ausgetauscht werden) ist mindestens so wichtig wie die Chiffre selbst. Vielleicht möchten Sie Ihre Ideen von jemandem testen lassen, der sich mit Kryptographie beschäftigt, um Ihnen die Schwächen zu erklären. (Ich bin sicher, dass es hier bei StackOverflow genug gibt. ;-))

+0

+1 für den guten Rat. Aber im Gegensatz zu dem, was Sie sagen, gaben mindestens zwei Antworten an, KEINE symmetrische Verschlüsselung durchzuführen (Andrew Austin und meine). – bortzmeyer

+0

Ich gebe zu, dass ich den Links nicht gefolgt bin, um herauszufinden, worum es bei ihnen ging. ;-) – DevSolar

+2

Ich muss etwas widersprechen (und natürlich würde ich); Wir haben keine Ahnung, was das OP vorhat. Wenn die Verschlüsselung und Entschlüsselung auf verschiedenen Computern erfolgt, ist ein interner Schlüssel sicher. Wenn er nur mit den SSL-Bibliotheken herumspielen möchte, ist die Sicherheit irrelevant. Ich gebe Ihnen +1 für den Rat, aber "Sie sollten dies nicht tun" ist ein bisschen zu stark eine Zusammenfassung. –