【问题标题】:Link error with OpenSSL [duplicate]OpenSSL的链接错误[重复]
【发布时间】:2014-02-07 09:40:47
【问题描述】:

我已经安装了 OpenSSL 。我只想使用 OpenSSL 运行一个程序。

这是我的程序,取自 here

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "openssl/aes.h"

int main(int argc, char* argv[])
{
  AES_KEY aesKey_;
  unsigned char userKey_[16];
  unsigned char in_[16];
  unsigned char out_[16];
  strcpy(userKey_,"0123456789123456");
  strcpy(in_,"0123456789123456");

  fprintf(stdout,"Original message: %s", in_);
  AES_set_encrypt_key(userKey_, 128, &aesKey_);
  AES_encrypt(in_, out_, &aesKey_);

  AES_set_decrypt_key(userKey_, 128, &aesKey_);
  AES_decrypt(out_, in_,&aesKey_);
  fprintf(stdout,"Recovered Original message: %s", in_);      
  return 0;
}

在编译程序时,我收到了与那里相同的错误消息,但那里提供的解决方案对我不起作用。

我仍然收到编译错误。

$ gcc -I/home/bholanath/Sources/openssl-1.0.1e/include/ op.c -lcrypt 

/tmp/ccvHr9Jr.o: In function `main':
op.c:(.text+0x9c): undefined reference to `AES_set_encrypt_key'
op.c:(.text+0xbc): undefined reference to `AES_encrypt'
op.c:(.text+0xd7): undefined reference to `AES_set_decrypt_key'
op.c:(.text+0xf7): undefined reference to `AES_decrypt'
collect2: error: ld returned 1 exit status

$ gcc op.c -lcrypt 

/tmp/ccDEZMog.o: In function `main':
op.c:(.text+0x9c): undefined reference to `AES_set_encrypt_key'
op.c:(.text+0xbc): undefined reference to `AES_encrypt'
op.c:(.text+0xd7): undefined reference to `AES_set_decrypt_key'
op.c:(.text+0xf7): undefined reference to `AES_decrypt'
collect2: error: ld returned 1 exit status

消除编译错误和运行我的程序的任何帮助都会很棒。 我在 Fedora linux 下使用 GCC。

【问题讨论】:

  • 库路径中有libcrypt.so 吗?请注意,通常情况下,您应该使用-lssl-lcrypto(而不是-lcrypt)。
  • 谢谢菲利普。使用 -lcrypto 它正在工作。
  • 你应该使用AES_encrypt和朋友。您应该使用EVP_* 函数。请参阅 OpenSSL wiki 上的 EVP Symmetric Encryption and Decryption。事实上,您可能应该使用经过身份验证的加密,因为它提供 机密性和真实性。请参阅 OpenSSL wiki 上的 EVP Authenticated Encryption and Decryption

标签: c linux gcc


【解决方案1】:

OpenSSL 库名称为 libcryptolibssl。尝试链接它们。 libcrypt 是 glibc 的一部分。

另外,your code is invalid

【讨论】:

  • 感谢 rubenvb ,使用 -lcrypto 它正在工作。代码很好,没有无效。
  • 你的代码无效,见strcpy的声明
  • 显示带有 -Wall 警告。没有那个选项,它工作正常。 gcc op.c -lcrypto
  • @bholanath 是的,这是有原因的。只需为 strcpy 添加一个演员 (char*) 或使用 char 并将其转换为 (unsigned char*) 以进行 OpenSSL 调用。
  • 是的,您对类型转换的建议,警告信息也不存在。谢谢。
【解决方案2】:

你的错误是你链接的是-lcrypt而不是-lcrypto,很简单。

libcrypt是glibc的一小部分,提供标准的Unix函数crypt(3)等,与OpenSSL完全无关。

【讨论】:

    【解决方案3】:

    供您参考,这是一个链接器错误,因为它正在搜索目标文件但无法找到这些文件。编译时传递了错误的库名称。你应该通过-lcrypto 而不是-lcrypt

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2017-05-15
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多