openssl c++ 3des ecb 加密

本文介绍了一个使用3DES加密算法的具体实现案例,特别是针对PKCS5Padding填充方式的应用。该实现涉及密钥设置、数据填充及加密过程,并提供了一段C++代码作为参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对接外部合作方,用到了3des ecb 加密,其中的补全方式为 PKCS5Padding。具体的算法原理可以网上找,网上很多,但是代码的坑比较多。

直接上实现后的代码了:
int Des3EdsEncrypt(const std::string& rand_key, const std::string& in, std::string& out)
{
	char out_array[10240];
	char in_array[10240];
	memset(out_array, 0, 10240);
	memset(in_array, 0, 10240);

	DES_key_schedule keyschedc1;
	DES_key_schedule keyschedc2;
	DES_key_schedule keyschedc3;

	if (rand_key.size() < 24)
	{
		LOG_ERROR("rand_key size < 24");
		return -1;
	}

	DES_set_key((DES_cblock *)rand_key.substr(0,8).c_str(), &keyschedc1);
	DES_set_key((DES_cblock *)rand_key.substr(8,8).c_str(), &keyschedc2);
	DES_set_key((DES_cblock *)rand_key.substr(16,8).c_str(), &keyschedc3);

	//数据不足8位的时候后面需要补齐 如果是取余为0,则补8个0
	int data_rest = in.size()%8;
	char ch = 8-data_rest;

	int len = (in.size()/8 + 1)*8;

	for (int i=0; i<in.size(); ++i)in_array[i] = in.at(i);
	memset(in_array + in.size(), ch, 8 - data_rest);

	for (int i=0; i<len; i += 8)
	{
	    DES_ecb3_encrypt((DES_cblock *)(in_array + i),
	                    (DES_cblock *)(out_array + i),
	                    &keyschedc1, &keyschedc2,
	                    &keyschedc3, DES_ENCRYPT);
	}

	out.assign(out_array, len);

	return 0;
}


C++中,OpenSSL库支持多种加密算法,包括3DES(Triple Data Encryption Standard)。当你提到3DES ECB(Electronic CodeBook)加Padding,通常是用于确保数据在固定长度块上加密,因为3DES的块大小是8字节。 `padding5`通常指的是PKCS7标准,它是一种常见的填充方式,会将剩余的空间填充到5个字节。例如,如果输入数据不足8字节,会添加0x01到0x05的数字,使得总共达到8字节的倍数,便于3DES ECB加密。 以下是使用OpenSSL库进行3DES ECB和PKCS7 Padding的基本步骤: 1. 包含必要的头文件: ```cpp #include <openssl/evp.h> #include <openssl/pem.h> #include <string> ``` 2. 初始化3DES上下文并设置ECB模式: ```cpp EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); if (!EVP_CipherInit_ex(ctx, EVP_3DES(), NULL, NULL, 0)) { // 处理错误 } EVP_CIPHER_CTX_set_padding(ctx, 1); // 设置为PKCS7填充,默认就是1,表示PKCS7 ``` 3. 准备明文和计算其实际填充后的长度: ```cpp std::string plaintext; // ... 加入明文 size_t original_len = plaintext.length(); size_t padded_len = (original_len + 7) / 8 * 8; // PKCS7 Padding会填充到8字节边界 unsigned char* padded_plaintext = new unsigned char[padded_len]; memset(padded_plaintext, original_len, padded_len - original_len); // 填充0 memcpy(padded_plaintext + padded_len - original_len, plaintext.c_str(), original_len); ``` 4. 进行加密: ```cpp unsigned char ciphertext[padded_len]; int res = EVP_CipherUpdate(ctx, ciphertext, &ciphertext_len, padded_plaintext, padded_len); if (res <= 0) { // 处理错误 } ``` 5. 清理资源: ```cpp EVP_CIPHER_CTX_cleanup(ctx); delete[] padded_plaintext; EVP_CIPHER_CTX_free(ctx); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值