2012-12-09 28 views
10

Kendimi OpenSSL, libncurses ve UDP ağı hakkında bilgi edinmek için bir program yazıyorum. Endüstri şifreleme standartlarına aşina olmak için OpenSSL'in SHA256'sı ile çalışmaya karar verdim, ancak çalışmayı sürdürmekle ilgili sorunlarım var. Hatayı, OpenSSL'nin derlenmiş programa bağlanmasıyla izole ettim. Ubuntu 12.10, 64 bit üzerinde çalışıyorum. Yüklenen libssl-dev paketine sahibim.OpenSSL'nin SHA256 işlevleri nasıl kullanılır?

alın, örneğin, C++ main.cpp: Ben SHA256() fonksiyonunu kullanıyorum

#include <iostream> 
#include <sstream> 
#include <string> 
#include <iomanip> 
using namespace std; 

#include <openssl/sha.h> 

string sha256(const string str) 
{ 
    unsigned char hash[SHA256_DIGEST_LENGTH]; 
    SHA256_CTX sha256; 
    SHA256_Init(&sha256); 
    SHA256_Update(&sha256, str.c_str(), str.size()); 
    SHA256_Final(hash, &sha256); 
    stringstream ss; 
    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++) 
    { 
     ss << hex << setw(2) << setfill('0') << (int)hash[i]; 
    } 
    return ss.str(); 
} 

int main() 
{ 

    cout << sha256("test") << endl; 
    cout << sha256("test2") << endl; 

    return 0; 

} 

OpenSSL SHA256 işlevselliği için bir sarıcı olarak here bulundu.

[email protected]:~/Programming/sha256$ g++ -lssl -lcrypto -o main main.cpp 
/tmp/ccYqwPUC.o: In function `sha256(std::string)': 
main.cpp:(.text+0x38): undefined reference to `SHA256_Init' 
main.cpp:(.text+0x71): undefined reference to `SHA256_Update' 
main.cpp:(.text+0x87): undefined reference to `SHA256_Final' 
collect2: error: ld returned 1 exit status 

Yani, GCC açıkça OpenSSL tanımlanmış fonksiyon ve türlerini tanır, ancak ld sevk işlev simgelerini bulmak için başarısız: Ben şu gın ++ argümanlarla derlemeye çalıştığınızda

aşağıdaki hatayı alıyorsunuz sha.h.

Belirli bir paylaşılan nesneyi veya dizini el ile işaretlemem gerekir mi?

Teşekkürler!

cevap

20

Çok yeni başlayanlar hata yapıyorsunuz ... Oluşturduğunuz kütüphane bağlantılarını komut satırında yanlış yere koymak.

Bağımlılıklar komut satırında tersine çevrilir, bu nedenle başka bir şeye bağlı olan bir şey,'dan önce komut satırında neye bağlı olduğuna göre belirtilmelidir.

$ g++ -o main main.cpp -lssl -lcrypto 

güvenli, her zaman koymak kütüphaneler olmak için: üzerinde örnekte

, sen kütüphanelerin bazı sette bağlı olan bir kaynak dosyası main.cpp var kütüphaneler önce bağlı sonra kaynak dosyası olmalıdır son, komut satırında listelenen herhangi bir kaynak veya nesne dosyasından sonra.

+0

Golly tarafından işe yaradı! Teşekkürler! GCC'yi küçük şeyler için yaklaşık 7 yıldır kullandım, ancak komut satırı argümanlarının böyle çalıştığını asla fark etmedim. -o main' sonra – millinon

+2

yeterlidir. Çok az Unix programı, argümanlardan sonra seçenekler koymanızı gerektirir ve genel olarak kötü bir uygulama IMO'sudur. –

+0

@jcomeau_ictx: Huh? Hayır, bu yeterli değil. Bu kütüphanelerdeki sembollere referans veren kaynak dosyalardan sonra gitmelidir. yani "main.cpp" sonra yeterlidir ". –

0

Bu sistemimde çalışıyor, ancak deneyebilirsiniz: g ++ openssl/sha.h tüm malzeme "C" işlevleri olarak ilan olduğunu söyler

extern "C" { 
#include <openssl/sha.h> 
} 

.

BTW, OpenSSL'niz kaç yaşında?

+0

Bunu denedim ve yukarıdaki GCC argümanlarımı kullanarak, hala aynı hataları aldım. Joachim'in önerisi onu düzeltti. Kayıt için OpenSSL sürüm 1.0.1c kullanıyorum. – millinon

İlgili konular