2017-08-04 3 views
0

Ich versuche, eine Datei mit EAX-Modus, zu verschlüsseln und dann die verschlüsselte Datei auf der Festplatte schreiben, mit dem iv:„Programm funktioniert nicht mehr“, wenn Daten in EAX-Modus verschlüsselt

//generate key 
SecByteBlock key(AES::DEFAULT_KEYLENGTH); 
rnd.GenerateBlock(key, key.size()); 

//generate iv 
byte iv[AES::BLOCKSIZE]; 
rnd.GenerateBlock(iv, AES::BLOCKSIZE); 
HexEncoder encoder(new FileSink(std::cout)); 

std::cout << "Key: "; 
encoder.Put(key, key.size()); 
encoder.MessageEnd(); 
std::cout << std::endl; 

std::cout << "IV: "; 
encoder.Put(iv, sizeof(iv)); 
encoder.MessageEnd(); 
std::cout << std::endl; 

EAX<AES>::Encryption encryptor; 
encryptor.SetKeyWithIV(key, key.size(), iv, sizeof(iv)); 

std::cout << "EAX set" << std::endl; 

FileSink file("iv_plus_message.enc"); 
std::cout << "file created" << std::endl; 

ArraySource write_iv(iv, sizeof(iv), true, new Redirector(file)); 
std::cout << "iv written to file" << std::endl; 

StringSource write_ciphertext(plaintext, true, //at this level,the executable stops working 
    new StreamTransformationFilter(encryptor, 
     new Redirector(file))); 
std::cout << "end" << std::endl; 

Als ich kompiliere und führe diesen Code aus, bekomme ich .exe has stopped working. Die letzte Sache ist iv written to file, so das Problem wäre, wenn es versucht, den Klartext zu verschlüsseln und an die Datei anhängen.

Was stimmt nicht mit dem Code und wie behebe ich ihn?

Antwort

0

auf dieser Ebene, die ausführbaren Anschläge

arbeiten Sie sollten Ihre Ausnahmen fangen. Wickeln Sie Ihr Programm in eine try and catch block, und Sie werden die folgenden Informationen sehen.

terminate called after throwing an instance of 'CryptoPP::InvalidArgument' 
    what(): StreamTransformationFilter: please use AuthenticatedEncryptionFilter and 
AuthenticatedDecryptionFilter for AuthenticatedSymmetricCipher 
Aborted (core dumped) 

Die documentation for EAX sagte Ihnen AuthenticatedEncryptionFilter und AuthenticatedDecryptionFilter zu verwenden.


In Zukunft geben Sie bitte ein Arbeits main, und bitte die unnötige cruft entfernen. In dem Code, den Sie zeigten, wurde weder fin noch open_file benötigt, aber ich verbrachte Zeit damit, es zu konvertieren, weil es Kompilierungsfehler verursachte.

Dieser arbeitete für mich:

$ cat test.cxx 

#include <iostream> 
#include <string> 

#include "filters.h" 
#include "osrng.h" 
#include "files.h" 
#include "aes.h" 
#include "hex.h" 
#include "eax.h" 
using namespace CryptoPP; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
     AutoSeededRandomPool prng; 

     SecByteBlock key(AES::DEFAULT_KEYLENGTH); 
     prng.GenerateBlock(key, key.size()); 

     byte iv[AES::BLOCKSIZE]; 
     prng.GenerateBlock(iv, AES::BLOCKSIZE); 

     HexEncoder encoder(new FileSink(std::cout)); 

     std::cout << "Key: "; 
     encoder.Put(key, key.size()); 
     encoder.MessageEnd(); 
     std::cout << std::endl; 

     std::cout << "IV: "; 
     encoder.Put(iv, sizeof(iv)); 
     encoder.MessageEnd(); 
     std::cout << std::endl; 

     EAX<AES>::Encryption encryptor; 
     encryptor.SetKeyWithIV(key, key.size(), iv, sizeof(iv)); 

     std::cout << "EAX set" << std::endl; 

     FileSink file("iv_plus_message.enc"); 
     std::cout << "file created" << std::endl; 

     ArraySource write_iv(iv, sizeof(iv), true, new Redirector(file)); 
     std::cout << "iv written to file" << std::endl; 

     std::string message = "Now is the time for all good men to come to the aid of their country"; 
     StringSource write_ciphertext(message, true, //at this level,the executable stops working 
      new AuthenticatedEncryptionFilter(encryptor, 
       new Redirector(file))); 
     std::cout << "end" << std::endl; 
    } 
    catch(const Exception& ex) 
    { 
     std::cerr << ex.what() << std::endl; 
     return 1; 
    } 

    return 0; 
} 

Und:

std::string message = "Now is the time for all good men to come to the aid of their country"; 
StringSource write_ciphertext(message, true, 
    new AuthenticatedEncryptionFilter(encryptor, 
     new Redirector(file))); 

Um wie etwas:

$ g++ -Wall test.cxx ./libcryptopp.a -o test.exe 

$ ./test.exe 
Key: 7DBBFEB8461B0D7019CBDC228790DD72 
IV: C2638D0A874F674C02249BEF9ED96C5A 
EAX set 
file created 
iv written to file 
end 

$ od -t x1 -An iv_plus_message.enc 
c2 63 8d 0a 87 4f 67 4c 02 24 9b ef 9e d9 6c 5a 
a7 e6 67 5d 76 60 99 dc 85 89 a8 ec 62 6c 40 4a 
00 d8 e8 c1 67 d8 92 99 5d 92 44 a3 ea 34 36 69 
ea 01 75 e4 03 7c 82 bf e2 90 77 cc d1 56 37 71 
31 d7 62 f7 b3 5f a9 3b f3 be 09 2d d4 b2 a5 99 
1d f6 85 34 93 d2 2e 71 60 be 53 96 dc 33 c3 92 
31 43 6a e9 

Wenn Sie eine Datei verschlüsseln möchten, dann dies ändern das untere. Unten verschlüssele ich das Testprogramm test.cxx weil es praktisch ist. Ich denke, das war Ihre fin oder open_file, die nicht verwendet wurde. Dann

FileSource write_ciphertext("test.cxx", true, 
    new AuthenticatedEncryptionFilter(encryptor, 
     new Redirector(file))); 

:

$ g++ -Wall test.cxx ./libcryptopp.a -o test.exe 

$ ./test.exe 
Key: 5FF94A36F677278A1A11F1AD95BE5F63 
IV: 3120DDC6B08C60B080EEC01842023755 
EAX set 
file created 
iv written to file 
end 

$ od -t x1 -An iv_plus_message.enc 
31 20 dd c6 b0 8c 60 b0 80 ee c0 18 42 02 37 55 
60 df 11 42 2b b1 24 d7 27 4a e0 ca ef 40 c0 ce 
87 29 97 7a d9 0c 40 91 61 da 74 2a 75 82 1a b8 
8b 76 2d 8c 15 98 31 69 a2 7e ac c4 da 83 e3 c5 
e7 1d 62 ab d5 6a 62 43 9a 19 f2 ed e7 a3 06 16 
d0 68 b7 55 a9 d7 4d fb 0d f0 d4 9c f4 01 0f 4f 
fd 78 ab d4 98 10 66 04 f7 a9 e3 b2 60 d9 09 0a 
ff fe a1 fa 22 17 6a bf 75 d8 11 d6 b9 1c c7 f6 
4c ac ef 2f 94 9f da d7 3d 4a 03 e0 61 58 41 0f 
64 01 1d ab a5 ab b7 b4 97 19 d7 41 82 52 df 8e 
89 de f8 ea 6f c7 c5 b8 97 0b 2f 1e f0 d5 e8 b8 
0b ef ce ba 13 d5 e9 db fa 59 76 a8 8c 22 b6 61 
6a 79 31 50 a8 69 3f ef 80 2d fc 0a 0b f9 b0 d4 
09 09 c1 7e 60 44 aa ec 1b 43 c0 be 4d ef 12 22 
1c 1c ad e3 a9 86 26 e6 84 e0 e1 9a 96 8c 21 2d 
5e b8 5d af 61 07 c8 3b 1a 31 5b a5 1e d5 e7 ad 
74 e2 3f 2f a2 f8 48 da db 8a 23 41 c6 e5 51 68 
7f e3 ad a0 e9 3b 47 58 9c 83 05 d6 17 87 58 eb 
e5 08 02 13 42 fa c5 77 1f 97 29 fc 94 db ff 8d 
15 83 63 cc e2 20 80 42 ae 43 62 05 5a a1 7f 1c 
47 ad c8 63 9d 70 d8 00 41 a4 31 18 df 25 db 73 
8c b2 47 78 29 31 61 3a 6f 16 af f6 64 e6 1a 79 
79 cb d4 39 7a 82 cc b7 b5 de d5 17 e7 7a 06 17 
a9 47 62 dc b8 17 39 11 e1 1d 00 58 d0 79 d6 1f 
a0 20 31 0e d9 a4 c0 42 78 3d 2f 9b 5b 09 43 6e 
c5 2e 57 f0 00 ac 76 1e 50 ff c7 60 72 68 e9 0b 
83 07 49 cc 52 64 ed 7f 6a ab 6d c8 d2 e3 d3 e0 
ca 64 3a 9b 7d 38 bb c1 e6 57 62 59 23 bf 63 ed 
06 a9 e2 55 dd 97 46 69 ec b4 b5 0e 3c 48 b6 25 
3a fc 5d 6f 1b 7d fc 6f 6a 1b e8 4d 74 b5 e0 72 
c6 18 d1 c6 ee 3d 92 e0 c2 b1 e8 06 78 de 36 f5 
c4 2a bc 01 bf e5 f9 51 3d fb f7 ec 7a af 71 00 
09 48 1f 19 9d 30 85 6d e4 97 b6 5c c4 ec 90 8b 
9f 56 19 ce 11 56 33 0f 1f e5 3a 78 fe 22 29 32 
8f 64 43 71 7f 70 44 d0 2e 6c 7c f0 0b da 70 86 
68 a9 b6 07 21 94 18 70 1e bc 6a 1c 99 a8 31 33 
ae 1e ce 4b 7e 1b 3b b2 bf 2d bf fa 7f 0f 05 1d 
0b a4 e1 7f b0 8b fd 31 c5 5c 69 d2 05 46 48 39 
36 cc cb 48 4e 5d 8b 10 53 ac bd 14 af 9b ea e4 
a4 73 75 61 12 d1 46 af 6b eb a9 70 4c 5d 37 8a 
ce ca 31 ec b1 67 2c 14 b7 54 10 a2 d3 d1 2e 5a 
30 99 ba 9c 9c e6 b9 e9 c9 a6 d7 51 83 48 7c 95 
6e 05 58 3b d7 28 9c b8 0f 3a 44 5a f4 e4 92 c9 
bf a6 f1 e7 dc 4e 66 9e f0 9b 94 0b 11 a8 46 ab 
fc e4 16 07 ca 26 d9 fd 10 57 32 85 82 b9 3c a6 
0d 21 9a 70 12 43 71 ee e2 75 f6 e5 07 94 dc c0 
cf de 63 79 a6 b8 5d 5e 82 f7 39 e1 84 68 76 c5 
c4 49 65 ce ea 9a d9 71 34 ef 74 ec 5c 94 c8 ae 
1d 8e 8c 1e ee 62 9b e0 0c 6f 91 50 8b 23 61 93 
6f 50 d1 a6 07 76 95 94 7a ea 94 b5 92 d3 d4 6d 
58 26 55 75 41 1c 4e 46 60 06 ee e5 36 8f 46 99 
3f 96 c9 dd 36 38 7e eb 6b 6d 43 7e e5 4e 03 d3 
e3 c0 33 cc a7 f5 91 91 8c 8d 5a 39 0f d6 84 a7 
0a c7 53 79 9b a7 96 e9 68 3f c7 71 e2 cc 6a 0a 
fe ae 58 32 1d 92 83 89 d1 bc 81 d7 f5 17 c9 f0 
6e 6c b5 12 dd f3 76 b2 5c a2 29 19 9b 77 ae 1c 
b6 8c b4 8e 64 31 bf ad 84 08 44 7c d5 ca ab af 
fb 78 29 c4 d2 98 a5 3b c2 29 af 83 27 1e 84 40 
48 f9 2c 9b a9 58 0a e3 b8 fe e1 77 14 70 dc fd 
83 d9 84 d8 03 13 d6 c5 cf 9a f1 ab d7 8f 5f 5f 
ee 1e 93 6c cd e5 d5 42 95 62 53 7e 6f 5c b7 44 
09 e1 2f 7d 3b b2 76 71 b9 3c 3a ea 7d e5 f4 d0 
f1 c0 ed be 45 a7 0f a7 de 9f 42 c6 0d b3 27 dc 
11 a0 e3 9c 1b 1f 09 72 7c 79 fe 54 2e 10 2c 1b 
6a fb 19 17 04 e6 1a 1d 6f 5e 36 43 f3 12 75 34 
4b e0 10 85 ed fa 63 7d ea 8a 2e 88 7e 25 40 d9 
6b 38 05 38 02 85 c5 3c 2f 93 d9 ff b2 e2 a1 f3 
fc 59 61 91 f5 19 40 8c a0 a1 f1 68 76 21 aa b2 
b7 2d 81 3d 31 c8 e6 1b d6 d7 37 2c 3d b2 a5 84 
42 d1 32 41 37 dd b6 86 4b 89 ac af 34 bf 66 5d 
7f bc 98 0a 25 f4 c2 14 b0 2f 99 21 70 04 59 f9 
ae f9 ae c9 2a ee 15 d3 89 24 47 0d 53 0c c8 d3 
71 c0 df e5 28 10 08 59 11 b4 1b bf c1 a1 44 74 
82 76 07 d7 31 e4 cd 62 5a a4 49 42 0e d2 c6 77 
aa b8 86 86 62 f2 d1 5b 9a 99 e6 60 3a ff c1 83 
97 ae 4f 2f 5a 47 e1 2b 87 84 00 a8 56 0c f9 e4 
a0 00 39 17 c6 d7 99 0e 3b 4f 0e 19 ba cc 7c d7 
de ab c8 a1 63 ef 65 6b 9c d2 55 fb b1 5c fa 04 
1a 6a 7e 03 30 9b ee a1 6f 9d 17 55 2a d1 cf 65 
eb 34 10 e0 4b 27 41 71 63 3b dd 57 7f a1 eb a2 
14 56 d0 d8 fc 33 06 57 9a 30 a5 d6 70 7e d0 70 
57 1d f2 ae d2 b8 67 82 77 ca 99 0f 8a b4 6f cd 
94 88 1a 0d 39 34 61 aa f9 0d e8 be ff 54 89 f0 
58 30 f1 e8 93 a2 10 83 c5 ce 28 81 d8 ec 10 4a 
68 9d d2 f3 a6 f6 32 5d da 18 aa 31 57 bb 57 6b 
c3 c2 4f 52 f8 f4 8e 97 88 e6 d9 f3 f1 2c a4 b2 
78 eb 6c 30 1e b8 99 b2 b8 41 fb fa b8 8e 21 3f 
45 2d 8f 80 b4 4b 6e b2 15 94 22 4d 1e 00 42 b8 
ab 37 42 19 4e 42 31 f9 55 fa 04 3d 83 a8 e2 1a 
92 00 a2 c4 9d ed 26 c1 6b 85 89 ec 01 cd 43 c8 
e6 00 6a 50 96 c3 1a 40 35 03 93 89 02 99 a7 64 
bd 0c 2d e6 80 b3 65 c5 af 43 0b 7c 88 ca 4a 82 
e3 76 d6 2c e3 8f 79 d9 bf e7 c6 31 26 6c bc 6f 
34 93 cc 61 b5 6f 07 58 84 ee 44 e8 a5 61 7b 52 
30 93 1d 2c dd 5c ad 93 ce e4 bc ba 19 49 ac 4a 
e5 5b 98 d1 aa a0 bf 8d a6 ef fc 43 d5 49 f6 6d 
1a 58 47 2c fa c4 7f b0 f0 01 21 29 02 cf 7f ae 
99 fc ca 90 e9 ae 53 3e 0d e7 8a da f4 1f 03 f7 
4c 19 69 8f 4b 19 84 6a b4 39 a9 73 44 49 bc ee 
f1 53 8e 63 d8 3a e5 09 
+0

Vielen Dank! Ihr Code funktioniert großartig, und ich komme, um den Entschlüsselungsteil zu erreichen. Ich musste nur die Größe von (iv) in iv.size() ändern, da sizeof (iv) 24 und iv.size() 16 zurückgibt, was die richtige Größe ist. – EinderJam

+0

Wenn ich jedoch versuche, die Originaldatei nach der Verschlüsselung zu löschen (mit std :: remove) bleibt die Datei übrig. Ich denke, dass die Datei immer noch von FileSource als "in use" markiert ist. Mit std :: ofstream rufen wir ".close()" auf, um das Handle freizugeben, aber wie machen wir das das mit FileSource? – EinderJam

+0

Genauer gesagt, std :: remove returns -1 – EinderJam

Verwandte Themen