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!
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
yeterlidir. Çok az Unix programı, argümanlardan sonra seçenekler koymanızı gerektirir ve genel olarak kötü bir uygulama IMO'sudur. –
@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 ". –