Search code examples
c++encryptionaescrypto++pbkdf2

Issues reimplementing some C# encryption stuff in C++ using cryptopp


So I have this piece of C# code:

void Decrypt(Stream input, Stream output, string password, int bufferSize) {
    using (var algorithm = Aes.Create()) {
        var IV = new byte[16];
        input.Read(IV, 0, 16);
        algorithm.IV = IV;
        var key = new Rfc2898DeriveBytes(password, algorithm.IV, 100);
        algorithm.Key = key.GetBytes(16);
        using(var decryptor = algorithm.CreateDecryptor())
        using(var cryptoStream = new CryptoStream(input, decryptor, CryptoStreamMode.Read)) {
            CopyStream(cryptoStream, output, bufferSize);
        }
    }
}

and I am trying to translate this into C++ with CryptoPP. So this is what I have written:

void decrypt(std::ifstream& in_file, std::ofstream& out_file, std::string_view password, size_t bufSize) {
    using namespace CryptoPP;
    // Get IV
    byte iv[16];
    in_file.read(reinterpret_cast<char*>(iv), sizeof(iv));
    // Read cypher
    std::string cypher;
    while (in_file && cypher.size() != bufSize) {
        char c;
        in_file.read(&c, 1);
        cypher.push_back(c);
    }
    // Get key
    byte key[16];
    PKCS5_PBKDF2_HMAC<SHA1> pbkdf2;
    pbkdf2.DeriveKey(key, sizeof(key), 0, reinterpret_cast<const byte*>(password.data()), password.size(), iv, sizeof(iv), 100);
    // Decrypt
    CTR_Mode<AES>::Decryption decrypt(key, sizeof(key), iv);
    std::string output;
    StringSource(cypher, true, new StreamTransformationFilter(decrypt, new StringSink(output)));
    // Write output to file
    out_file.write(output.data(), output.size());
}

However, from this function, I am only getting back trash data. What could I be doing wrong?

Thanks

Tuxifan!


Solution

  • So I found the solution! First of all, as @mbd mentioned, C# uses CBC by default. Additionally, I need to cut away the rest of the data like this:

    while ((cipher.size() % 16) != 0) {
        cipher.pop_back();
    }