You can download the Crypto++ 's manual from this 
link:https://www.cryptopp.com/docs/ref/CryptoPPRef.zip.

在 2018年4月15日星期日 UTC+8上午11:13:31,Trung B. Pham写道:
>
> Hi, 
>
> I am very new to this library and trying to use it for a personal project.
> Can someone please review the below code for correctness?
>
> Let's call this program xyz.
> So,
> g++ main.cpp -O3 -o xyz -lcryptopp
>
> Encrypt file using Threefish1024/CTR and PBKDF2
> ./xyz -p password -s salt -i filename > filename.enc
> Decrypt file using Threefish1024/CTR and PBKDF2
> ./xyz -p password -s salt -i filename.enc > filename.enc.dec
> Derive key using PBKDF2:
> ./xyz -h password -s salt
>
>
>
> #include <assert.h>
> #include <string.h>
>
>
> #include <fstream>
> #include <iostream>
> #include <string>
> #include <iterator>
>
>
> #include <cryptopp/modes.h>
> #include <cryptopp/pwdbased.h>
> #include <cryptopp/sha3.h>
> #include <cryptopp/threefish.h>
> #include <cryptopp/hex.h>
>
>
> #define KEY_LENGTH 128U
> #define CTR_LENGTH 128U
> #define TWEAK_LENGTH 16U
>
> // Read all file into std::vector<char>
> static std::vector<char> read_file(char const *filename) {
>     std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
>     std::ifstream::pos_type pos = ifs.tellg();
>
>     std::vector<char> result(pos);
>
>
>     ifs.seekg(0, std::ios::beg);
>     ifs.read(result.data(), pos);
>
>
>     return result;
> }
>
>
> int main(int argc, char *argv[]) {
>
>     // Encrypt and decrypt file using Threefish1024/CTR and PBKDF2
>     // Require password, salt, and filename
>     // Output: stdout
>     if (argc == 7 && strcmp(argv[1], "-p") == 0 && strcmp(argv[3], "-s") 
> == 0 && strcmp(argv[5], "-i") == 0) {
>
>         size_t pwd_len = strlen(argv[2]);
>         size_t salt_len = strlen(argv[4]);
>         assert(pwd_len >= 10);
>         assert(salt_len >= 10);
>
>
>         try {
>             size_t buf_len = KEY_LENGTH + CTR_LENGTH + TWEAK_LENGTH;
>             CryptoPP::byte buf[buf_len];
>             CryptoPP::PKCS5_PBKDF2_HMAC<CryptoPP::SHA3_512> pbkdf2;
>             pbkdf2.DeriveKey(buf, buf_len, 0, (CryptoPP::byte *)argv[2], 
> pwd_len, (CryptoPP::byte *)argv[4], salt_len, 42);
>
>             std::vector<char> plain_text = read_file(argv[6]);
>             
>             // I am very unsure about ConstByteArrayParameter and SetTweak
>             // Please advise
>             CryptoPP::ConstByteArrayParameter tweak(&buf[KEY_LENGTH + 
> CTR_LENGTH], TWEAK_LENGTH, false);
>             CryptoPP::AlgorithmParameters params = CryptoPP::
> MakeParameters(CryptoPP::Name::Tweak(), tweak);
>             CryptoPP::Threefish1024::Encryption t3f(buf, KEY_LENGTH);
>             t3f.SetTweak(params);
>             CryptoPP::CTR_Mode_ExternalCipher::Encryption encryptor(t3f, &
> buf[KEY_LENGTH]);
>             encryptor.ProcessData((CryptoPP::byte *)plain_text.data(), (
> CryptoPP::byte *)plain_text.data(), plain_text.size());
>             std::copy(plain_text.begin(), plain_text.end(), std::
> ostream_iterator<char>(std::cout, ""));
>         } catch (CryptoPP::Exception const& ex) {
>             std::cout << "CryptoPP::Exception caught: " << ex.what() << 
> std::endl;
>             exit(-1);
>         } catch (std::exception const& ex) {
>             std::cout << "std::exception caught: " << ex.what() << std::
> endl;
>             exit(-1);
>         }
>
>     // Derive key using PBKDF2
>     // Require password and salt
>     // Output: stdout
>     } else if (argc == 5 && strcmp(argv[1], "-h") == 0 && strcmp(argv[3], 
> "-s") == 0) {
>
>         size_t pwd_len = strlen(argv[2]);
>         size_t salt_len = strlen(argv[4]);
>         assert(pwd_len >= 10);
>         assert(salt_len >= 10);
>
>         try {
>             size_t buf_len = 64;
>             CryptoPP::byte buf[buf_len];
>             CryptoPP::PKCS5_PBKDF2_HMAC<CryptoPP::SHA3_512> pbkdf2;
>             pbkdf2.DeriveKey(buf, buf_len, 0, (CryptoPP::byte *)argv[2], 
> pwd_len, (CryptoPP::byte *)argv[4], salt_len, 42);
>
>             std::string encoded;
>             CryptoPP::StringSource(buf, buf_len, true, new CryptoPP::
> HexEncoder(new CryptoPP::StringSink(encoded), false));
>             std::cout << encoded;
>         } catch (CryptoPP::Exception const& ex) {
>             std::cout << "CryptoPP::Exception caught: " << ex.what() << 
> std::endl;
>             exit(-1);
>         } catch (std::exception const& ex) {
>             std::cout << "std::exception caught: " << ex.what() << std::
> endl;
>             exit(-1);
>         }
>
>     } else {
>         printf("Wrong argv\n");
>         exit(-1);
>     }
>
>
>     return EXIT_SUCCESS;
> }
>
>
>
>

-- 
You received this message because you are subscribed to "Crypto++ Users". More 
information about Crypto++ and this group is available at 
http://www.cryptopp.com and 
http://groups.google.com/forum/#!forum/cryptopp-users.
--- 
You received this message because you are subscribed to the Google Groups 
"Crypto++ Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to cryptopp-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to