2014-01-30 11 views
6

Ich habe einen Puffer, in dem ich einige Klartext hinzufügen. Ich möchte OpenSSL-AES-Verschlüsselung verwenden, um den Text zu verschlüsseln, entschlüsseln und auf dem Bildschirm ausdrucken.Verschlüsselung und Entschlüsselung mit C++

Code wird ohne Fehler ausgeführt.

#include <fstream> 
#include <iostream> 
#include <stdio.h> 
#include <string> 
#include <openssl/aes.h> 
using namespace std; 

void main() 
{ 

// Buffers 
unsigned char inbuffer[1024]; 
unsigned char encryptedbuffer[1024]; 
unsigned char outbuffer[1024]; 


// CODE FOR ENCRYPTION 
//-------------------- 
unsigned char oneKey[] = "abc"; 
AES_KEY key; 

AES_set_encrypt_key(oneKey,128,&key); 
AES_set_decrypt_key(oneKey,128,&key); 

//-------------------- 


string straa("hello world\n"); 
memcpy((char*)inbuffer,straa.c_str(),13); 


printf("%s",inbuffer); 
//this prints out fine 

AES_encrypt(inbuffer,encryptedbuffer,&key); 
//printf("%s",encryptedbuffer); 
//this is expected to pring out rubbish, so is commented 

AES_decrypt(encryptedbuffer,outbuffer,&key); 
printf("%s",outbuffer); 
//this is not pringint "hello world" 

getchar(); 

} 

Ich bin mir der Tatsache, dass einmal in den neuen Puffer platziert, „encryptedbuffer“ und „outBuffer“, sind sie nicht „\ 0“ Nullterminiert, aber auch so, indem Sie die Rohdaten auszudrucken, Ich bekomme nur Müll nach der Entschlüsselung, Am Ende der Entschlüsselung nehme ich an, dass das \ 0 auch entschlüsselt werden sollte und daher sollte der Printf korrekt drucken.

Wer weiß, wie die Entschlüsselung funktioniert?

Auch eine Idee, wie die Puffer mit C++ - Bibliotheken zu drucken, vielleicht cout, und nicht printf?

+1

Der Mechanismus, den Sie für Schlüssel verwenden, ist nicht korrekt. AES ist ein symmetrischer Blockalgorithmus und benötigt einen Schlüssel, der der Blockgröße entspricht. Eine Lösung im PBE-Stil (passwortbasierte Verschlüsselung) verwendet häufig einen entsprechend großen Hash-Auszug des Passworts, um einen Schlüssel in der richtigen Größe zu generieren (in diesem Fall 16 Byte). Das gleiche Passwort, das mit dem gleichen Algorithmus gehashed wurde, wird auf der Empfängerseite verwendet, um den identischen symmetrischen Schlüssel zu erzeugen und die Entschlüsselung durchzuführen. Mit anderen Worten, Ihr Passwort stimmt nicht mit der Chiffre überein. sein * Digest * aus einem Algorithmus, der beiden Seiten bekannt ist. – WhozCraig

+2

(1) Machen Sie 'oneKey' mindestens 16 Bytes (im Moment sind es nur 3 Bytes). Die zusätzlichen Bytes werden ignoriert. (2) Mache "straa" genau 16 Bytes (im Moment sind es nur 12 oder 13 Bytes). (3) Setzen Sie den Schlüssel zwischen den Aufrufen von 'AES_encrypt' und' AES_decrypt' zurück. (4) Überlegen Sie, auf die 'EVP_ *' - Funktionen zu wechseln, die für einen Anfänger einfacher sind. Siehe beispielsweise [Symmetrische Verschlüsselung und Entschlüsselung von EVP] (http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption) im OpenSSL-Wiki. Verwenden Sie 'EVP_aes_128_ecb()' als Chiffre für ein gleichwertiges Programm. – jww

+0

schätzen die klaren Anweisungen! Alles scheint jetzt mehr Sinn zu machen! :) danke –

Antwort

3

bemerke ich ein paar mögliche Probleme:

  • Der Aufruf von AES_set_decrypt_key verwendet die gleiche key wie der vorherige Aufruf somit den Schlüsselwert zu überschreiben. Um beide Aufrufe so auszuführen, wäre es notwendig, eine separate Schlüsselinstanz zu verwenden. Andernfalls warten Sie, bis Sie die AES_set_decrypt_key anrufen, nachdem die Verschlüsselung abgeschlossen ist.
  • Der Schlüsselpuffer, der an AES_set_encrypt_key übergeben wird, muss für die Bittiefe von 128 16 Byte lang sein. So wie es ist, wird es 16 Byte lesen, aber deren Inhalt ist nicht definiert.
+0

die 'AES_set_decrypt_key' hinzufügen, nachdem ich die Verschlüsselung tatsächlich funktioniert hatte! die 'printf ("% s", outbuffer);' druckt nun die richtige "Hallo Welt" aus. Ich schätze die einfache, aber effiziente Lösung sehr. –

+1

Ich bin froh, dass es funktioniert hat. Beachten Sie, dass der Schlüsselpuffer immer noch 16 Byte sein sollte. Es gibt keine Garantie, dass die "undefinierten" 12 Bytes, die der vorhandenen "oneKey" - Variable folgen, zwischen den beiden Aufrufen unverändert bleiben. –

+2

@DaniMarianMorar beachten Marks Warnung. Der Schlüssel * muss * 16 Bytes breit sein.Wenn dies nicht der Fall ist, greift die OpenSSL-Bibliothek blind auf alles zu, was nach dem Schlüssel im Speicher ist, was ** undefiniertes Verhalten ** bedeutet. Denken Sie darüber nach, welche Nachteile daraus entstehen würden, wenn das, was folgte, Ihr verschlüsselter Textblock wäre. – WhozCraig