如何使用OpenSSL的SHA256功能

时间:2012-12-09 03:47:05

标签: c++ gcc openssl sha256

我正在编写一个程序,让自己熟悉OpenSSL,libncurses和UDP网络。我决定使用OpenSSL的SHA256来熟悉行业加密标准,但我遇到了让它运行的问题。我已将错误隔离到OpenSSL与已编译程序的链接。我正在研究64位的Ubuntu 12.10。我安装了libssl-dev软件包。

例如,使用C ++ main.cpp:

#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;

}

我正在使用SHA256()函数找到here作为OpenSSL SHA256功能的包装。

当我尝试使用以下g ++参数进行编译时,收到以下错误:

millinon@myhost:~/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

因此,GCC清楚地识别OpenSSL定义的函数和类型,但ld未能找到sha.h中引用的函数符号。

我是否需要手动指向特定的共享对象或目录?

谢谢!

2 个答案:

答案 0 :(得分:26)

你犯了一个非常常见的初学者错误...你在构建时将你链接的库放在命令行的错误位置。

依赖项在命令行中是相反的,因此依赖于其他东西的东西实际上应该之前在命令行上依赖它。

在您的示例中,您有一个依赖于某些库的源文件main.cpp,那么源文件应该在它依赖的库之前:

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

为了安全起见,在命令行上列出的任何源文件或目标文件之后,始终将库最后

答案 1 :(得分:0)

这在我的系统上运行正常,但您可以尝试:

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

告诉g ++ openssl / sha.h中的所有东西都被声明为“C”函数。

BTW,你的OpenSSL多大了?