如何在C++中使用openssl/md5来加密字符串?

3 c openssl md5 aes

我需要在我的程序中将md5中的字符串加密.有一个lib openssl,但我是一个新手.如何使用它来加密一个字符串,哪里可以找到一个好的doc,教我如何使用这个lib,还有其他函数如aes?

我试过这段代码:

int main()
{
    unsigned char result[MD5_DIGEST_LENGTH];
    const unsigned char* str;
    str = (unsigned char*)"hello";
    unsigned int long_size = 100;
    MD5(str,long_size,result);
}
Run Code Online (Sandbox Code Playgroud)

但是编译器告诉我:undefined引用MD5.

为什么有未定义的引用MD5

Mor*_*sen 6

你应该看看文档.一个选项是使用此功能:

#include <openssl/md5.h>
unsigned char *MD5(const unsigned char *d, 
                   unsigned long n,
                   unsigned char *md);
Run Code Online (Sandbox Code Playgroud)

他们声明:

MD2(),MD4()和MD5()计算n字节的MD2,MD4和MD5消息摘要d并将其放入md(必须有空间用于MD2_DIGEST_LENGTH == MD4_DIGEST_LENGTH == MD5_DIGEST_LENGTH == 16字节输出) .如果md为NULL,则将摘要放在静态数组中.

至于AES,如果您还想使用OpenSSL,那么请查看EVP doc以及如何使用它的示例.请注意,您必须添加

#define AES_BLOCK_SIZE 16
Run Code Online (Sandbox Code Playgroud)

但是,在文件的顶部,它可以工作.

顺便说一句.我真的可以推荐Crypto ++库,因为它很棒,并且有各种加密原语; AES,椭圆曲线,MAC,公钥加密等.


Mic*_*ael 6

MD5 函数现已弃用,因此如果您想避免代码中出现所有这些讨厌的警告...

以下是如何通过 C++ 将 md5 与 OpenSSL 3.0 及更高版本一起使用的简单示例:

#include <openssl/evp.h>
#include <cstdio>

using namespace std;

string md5(const string& content)
{
  EVP_MD_CTX*   context = EVP_MD_CTX_new();
  const EVP_MD* md = EVP_md5();
  unsigned char md_value[EVP_MAX_MD_SIZE];
  unsigned int  md_len;
  string        output;

  EVP_DigestInit_ex2(context, md, NULL);
  EVP_DigestUpdate(context, content.c_str(), content.length());
  EVP_DigestFinal_ex(context, md_value, &md_len);
  EVP_MD_CTX_free(context);

  output.resize(md_len * 2);
  for (unsigned int i = 0 ; i < md_len ; ++i)
    std::sprintf(&output[i * 2], "%02x", md_value[i]);
  return output;
}
Run Code Online (Sandbox Code Playgroud)

根据:https ://www.openssl.org/docs/man3.0/man3/EVP_DigestInit_ex.html