Salut !
J’ai un souci avec cryptoPP.
J’essaye d’adapter le code suivant1 pour qu’il fonctionne avec des fichiers à la place de strings:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | AutoSeededRandomPool prng; SecByteBlock key(AES::DEFAULT_KEYLENGTH); prng.GenerateBlock( key, key.size() ); byte iv[ AES::BLOCKSIZE ]; prng.GenerateBlock( iv, sizeof(iv) ); string plain = "CBC Mode Test"; string cipher, encoded, recovered; /*********************************\ \*********************************/ try { cout << "plain text: " << plain << endl; CBC_Mode< AES >::Encryption e; e.SetKeyWithIV( key, key.size(), iv ); // The StreamTransformationFilter adds padding // as required. ECB and CBC Mode must be padded // to the block size of the cipher. StringSource ss( plain, true, new StreamTransformationFilter( e, new StringSink( cipher ) ) // StreamTransformationFilter ); // StringSource } catch( const CryptoPP::Exception& e ) { cerr << e.what() << endl; exit(1); } /*********************************\ \*********************************/ // Pretty print cipher text StringSource ss( cipher, true, new HexEncoder( new StringSink( encoded ) ) // HexEncoder ); // StringSource cout << "cipher text: " << encoded << endl; /*********************************\ \*********************************/ try { CBC_Mode< AES >::Decryption d; d.SetKeyWithIV( key, key.size(), iv ); // The StreamTransformationFilter removes // padding as required. // StringSource ss( cipher, true, new StreamTransformationFilter( d, new StringSink( recovered ) ) // StreamTransformationFilter ); // StringSource cout << "recovered text: " << recovered << endl; } catch( const CryptoPP::Exception& e ) { cerr << e.what() << endl; exit(1); } |
Voila où je suis arrivé:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | void AESCrypter::encrypt( QString input, QString output) { const char* in = input.toStdString().c_str(); const char* out = output.toStdString().c_str(); std::cout <<"preparation... "<<in<<" will be encrypted as "<<out<<"\n"; try{ CryptoPP::CBC_Mode< CryptoPP::AES >::Encryption e; e.SetKeyWithIV( m_key, m_key.size(), m_iv ); CryptoPP::FileSource fs(in, true, new CryptoPP::StreamTransformationFilter( e, new CryptoPP::FileSink( out ) )// StreamTransformationFilter ); // StringSource } catch( const CryptoPP::Exception& e ) { std::cerr << e.what() << std::endl; return ; } std::cout <<"no error, "<<in<<" has been encrypted without any issues as "<<out<<"\n"; } |
Et je l’utilise comme ça :
1 2 3 | //main.cpp AESCrypter crypter{}; crypter.encrypt(argv[1], "/Users/d3m0t3p/t1Encrypted.txt"); |
Exemple :
./crypto /Users/d3m0t3p/t1.txt
preparation, /Users/d3m0t3p/t1.txt will be encrypted as /Users/d3m0t3p/t1Encrypted.txt
no error, /Users/d3m0t3p/t1.txt has been encrypted without any issues as
Les erreurs :
- le text de sortie montre que le contenu de
out
est changé. - le fichier encrypté créé se trouve à coté de l’exécutable et non à la destination du chemin
- le nom de fichier ressemble à quelques chose comme ça ]%B5G}%B5%D0&@"s0%DFRncrypted.txt à la place du nom attendu
Si je créer un fichier avec le même chemin mais en utilisant QFile le fichier est créé au bon endroit avec le bon nom.
Est-ce un bug de cryptoPP ou je ne l’utilise pas correctement ?
+0
-0