2013-08-17 2 views
1

Я пытался зашифровать файл, используя библиотеку Ботан и закодированы следующим образом:Ошибка компиляции примера Ботан в Qt

#include <botan/botan.h> 
#include <cstring> 
#include <vector> 
#include <iostream> 
#include <memory> 
#include <fstream> 
#include <string> 

using namespace Botan; 
using namespace std; 

void Encrypt(SymmetricKey key, InitializationVector iv, 
      string inFilename, string outFilename) 
{ 

} 

int main(int argc, char *argv[]) { 
    QCoreApplication a(argc, argv); 

    qDebug() << "Starting Botan..."; 

    string filePlainText = "C:\\myfile.txt"; 
    string fileEncrypted = "C:\\encrypted.txt"; 
    string fileDecrypted = "C:\\decrypted.txt"; 

    string passphrase = "mypassword"; 

    Botan::LibraryInitializer init; 
    AutoSeeded_RNG rng; 

    S2K* s2k = get_s2k("PBKDF2(SHA-256)"); 
    s2k->set_iterations(4049); 

    SecureVector<byte> key_and_IV = s2k->derive_key(48, passphrase).bits_of(); 
    SymmetricKey key(key_and_IV, 32); 
    InitializationVector iv(key_and_IV + 32, 16); 

    Encrypt(key, iv, filePlainText, fileEncrypted); 



    return a.exec(); 
} 

Но я получаю сообщение об ошибке при компиляции:

error: 'class Botan::PBKDF' has no member named 'set_iterations' 
error: no matching function for call to 'Botan::PBKDF::derive_key(int, std::string&)' 
...\_111-build-desktop-Qt_4_8_1_for_Desktop_-_MinGW__Qt_SDK__Debug\..\..\..\botan\include\botan\pbkdf.h:40: candidates are: virtual Botan::OctetString Botan::PBKDF::derive_key(size_t, const std::string&, const Botan::byte*, size_t, size_t) const 

Как я могу почини это?

+0

Ваш компилятор - ваш друг, прочитайте его сообщение, и вы увидите, что вы не используете хорошее определение 'derive_key' – jbh

ответ

0

Согласно this similar question и документации, get_s2k() был устарел в пользу get_pbkdf().

Я не смог найти обновленный учебник, но исходный код содержит примеры для новой функции. Например, фрагмент из doc/examples/encrypt.cpp:

std::auto_ptr<PBKDF> pbkdf(get_pbkdf("PBKDF2(SHA-1)")); 

    SecureVector<byte> salt(8); 
    rng.randomize(&salt[0], salt.size()); 

    const u32bit PBKDF2_ITERATIONS = 8192; 

    SymmetricKey bc_key = pbkdf->derive_key(key_len, "BLK" + passphrase, 
              &salt[0], salt.size(), 
              PBKDF2_ITERATIONS); 

    InitializationVector iv = pbkdf->derive_key(iv_len, "IVL" + passphrase, 
               &salt[0], salt.size(), 
               PBKDF2_ITERATIONS); 

    SymmetricKey mac_key = pbkdf->derive_key(16, "MAC" + passphrase, 
              &salt[0], salt.size(), 
              PBKDF2_ITERATIONS); 

Есть и другие примеры, тоже. Я думаю, что примеры из исходного кода являются наиболее надежными источниками информации.