2016-12-04 4 views
-1

Ich versuche, einen Code für AES zu kompilieren, aber ich bekomme einen Fehler, wenn ich es versuche. Der Code ist unten angegeben:Fehlende Symbole Rijndael :: Enc :: ProcessAndXorBlock und Rijndael :: Dec :: ProcessAndXorBlock

#include <iostream> 
#include <iomanip> 

#include "modes.h" 
#include "aes.h" 
#include "filters.h" 

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

//Key and IV setup 
//AES encryption uses a secret key of a variable length (128-bit, 196-bit or 256- 
//bit). This key is secretly exchanged between two parties before communication 
//begins. DEFAULT_KEYLENGTH= 16 bytes 
byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ], iv[ CryptoPP::AES::BLOCKSIZE ]; 
memset(key, 0x00, CryptoPP::AES::DEFAULT_KEYLENGTH); 
memset(iv, 0x00, CryptoPP::AES::BLOCKSIZE); 

// 
// String and Sink setup 
// 
std::string plaintext = "Now is the time for all good men to come to the aide..."; 
std::string ciphertext; 
std::string decryptedtext; 

// 
// Dump Plain Text 
// 
std::cout << "Plain Text (" << plaintext.size() << " bytes)" << std::endl; 
std::cout << plaintext; 
std::cout << std::endl << std::endl; 

// 
// Create Cipher Text 
// 
CryptoPP::AES::Encryption aesEncryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH); 
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv); 

CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink(ciphertext)); 
stfEncryptor.Put(reinterpret_cast<const unsigned char*>(plaintext.c_str()), plaintext.length() + 1); 
stfEncryptor.MessageEnd(); 

// 
// Dump Cipher Text 
// 
std::cout << "Cipher Text (" << ciphertext.size() << " bytes)" << std::endl; 

for(int i = 0; i < ciphertext.size(); i++) { 

    std::cout << "0x" << std::hex << (0xFF & static_cast<byte>(ciphertext[i])) << " "; 
} 

std::cout << std::endl << std::endl; 

// 
// Decrypt 
// 
CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH); 
CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv); 

CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink(decryptedtext)); 
stfDecryptor.Put(reinterpret_cast<const unsigned char*>(ciphertext.c_str()), ciphertext.size()); 
stfDecryptor.MessageEnd(); 

// 
// Dump Decrypted Text 
// 
std::cout << "Decrypted Text: " << std::endl; 
std::cout << decryptedtext; 
std::cout << std::endl << std::endl; 

return 0; 
} 

Der Fehler I ist unten angegeben bin immer, dies ist nur eine kleine Auswahl, es gibt viel mehr, aber es scheint alles wie folgt aus:

"non-virtual thunk to CryptoPP::Rijndael::Enc::ProcessAndXorBlock(unsigned char const*, unsigned char const*, unsigned char*) const", referenced from: 
     vtable for CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::Rijndael::Enc> in project-53b621.o 
     vtable for CryptoPP::ClonableImpl<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::Rijndael::Enc>, CryptoPP::Rijndael::Enc> in project-53b621.o 
    "non-virtual thunk to CryptoPP::Rijndael::Enc::AdvancedProcessBlocks(unsigned char const*, unsigned char const*, unsigned char*, unsigned long, unsigned int) const", referenced from: 
     vtable for CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::Rijndael::Enc> in project-53b621.o 
     vtable for CryptoPP::ClonableImpl<CryptoPP::BlockCipherFinal<(CryptoPP::CipherDir)0, CryptoPP::Rijndael::Enc>, CryptoPP::Rijndael::Enc> in project-53b621.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

I Ich bin nicht wirklich sicher, was das Problem ist, ich habe überall gesucht, um zu versuchen, das zu lösen, aber ich habe nichts gefunden, was funktioniert. Jeder Rat würde geschätzt werden.

+0

Um herauszufinden, wie Sie das beheben können, benötigen wir weitere Informationen, wie Plattformdetails und Compile/Link-Befehle. Wenn man aus der Hüfte schießt, hört es sich so an, als ob man * nicht * mit "libcryptopp.a" verlinkt hätte. Oder die Bibliothek befindet sich im Befehl compile/link an der falschen Stelle. Siehe auch [Wie wird eine Verbindung zu einer statischen Bibliothek in C hergestellt?] (Http://stackoverflow.com/q/1705961) Crypto ++ hat einen ähnlichen Bericht zu [Problem 283: Verbindungsfehler bei nicht übereinstimmenden Bibliotheks- und Programmfunktionen] (https: //github.com/weidai11/cryptop/issues/283). Das liegt an einer ABI-Pause, aber ich glaube nicht, dass sie auf dich zutrifft. – jww

Antwort

0

Haben Sie versucht, Ihre Header #include "cryptopp/modes.h" etc? Ich bin nicht sicher, wie Sie Crypto ++ auf Ihrem Computer installiert haben, aber das könnte das Problem sein, da es ein Linker-Problem ist. Stellen Sie sicher, dass Sie mit -lcryptopp kompilieren. Sehen Sie sich an, wie Sie Ihre Objektdateien verknüpfen. Erklären Sie, wie und wo Sie Cryptopp installiert haben. Veröffentlichen Sie weitere Informationen dazu

+0

Wenn ich #include "cryptopp/modes.h" hinzufüge, gibt es einen Fehler – Dylan

+0

Ich aktualisierte die Antwort, um Sie für weitere Informationen zu fragen –

Verwandte Themen