Openssl

本文介绍了OpenSSL,一个包含SSL协议库和密码算法库的开源代码库,主要用于C/C++开发。主要内容包括如何在Ubuntu 18.04上安装OpenSSL库及其开发环境,以及如何在编程中使用OpenSSL的密码算法和协议,强调了编译时需要链接的库文件。
摘要由CSDN通过智能技术生成

Openssl

Openssl 是一个开源的代码库,包括 SSL 协议库,应用程序和密码算法库,主要适用于 C/C++开发,内置许多加密算法。

安装 Openssl 库

Ubuntu 18.04 内置了 1.1.0 版本的 Openssl,可以使用openssl version查看版本。也可以像其他软件一样更新之,sudo apt install opensll

但是以上的 Openssl 只能用于终端,并不能用于编程,需要安装 Openssl 的开发环境:

  • sudo apt install libssl-dev
  • 相关头文件被安装/usr/include/openssl中,也可以软链接到/usr/local/include中,相关库文件默认安装在/usr/lib/x86_64-linux-gnu/中。

使用 Openssl 库

一般使用 Openssl 是使用其中的密码算法,它的密码算法都必须链接libcrypto.so链接库;如果使用的是ssl协议,则需要链接libssl.so链接库。

编译命令为g++ demo.cpp -lcrypto

#include <openssl/sha.h>
#include <openssl/md5.h>

/**
 * md5算法,对data进行认证处理
 * 输入:data,待md5的数据
 * 输出:128位字符的散列值,为方便处理,输出时转换为了十六进制的string
 */
std::string get_md5(const std::string &data)
{
	unsigned char *result = new unsigned char[20];

	MD5_CTX ctx;
	MD5_Init(&ctx);
	MD5_Update(&ctx, data.c_str(), data.size());
	MD5_Final(result, &ctx);

	char *buf = new char[32];
	for (int i = 0; i < MD5_DIGEST_LENGTH; i++)
	{
		sprintf((char *)&buf[i * 2], "%02x", result[i]);
	}

	return std::string(buf, MD5_DIGEST_LENGTH * 2);
}

/**
 * sha256算法
*/
string sha256(const string str)
{
	char buf[10];
	unsigned char hash[SHA256_DIGEST_LENGTH];
	SHA256_CTX sha256;
	SHA256_Init(&sha256);
	SHA256_Update(&sha256, str.c_str(), str.size());
	SHA256_Final(hash, &sha256);
	string NewString = "";
	for (int i = 0; i < SHA256_DIGEST_LENGTH; i++)
	{
		sprintf(buf, "%02x", hash[i]);
		NewString = NewString + buf;
	}
	return NewString;
}

/**
 * hmac_sha256算法,利用key对data进行加密认证处理
 * 输入:data,待sha256的数据;key,mac的密钥
 * 输出:256位加密字符,为方便处理,输出时转换为了string
 */
std::string get_hmac_sha256(const std::string &data, const std::string &key)
{
	unsigned char *result = new unsigned char[40];
	unsigned int result_len = 0;

	HMAC_CTX *ctx = HMAC_CTX_new();
	HMAC_Init_ex(ctx, key.c_str(), key.size(), EVP_sha256(), NULL);
	HMAC_Update(ctx, (unsigned char *)data.c_str(), data.size());
	HMAC_Final(ctx, result, &result_len);
	HMAC_CTX_free(ctx);

	// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	// 不可以return string(result),string的构造函数不接受unsigned char *
	// 不可以直接 return (char *)result
	// 因为result后面还有空余字符,加密的值要严格控制在result_len的长度范围内
	// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	return std::string((char *)result, result_len);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值