OPENSSL-2023/11/10学习记录-C/C++对称分组加密DES

image.png

image.png

image.png

image.png

image.png

  • 对称分组加密常用算法:

·DES
·3DES
·AES

·国密SM4

  • 对称分组加密应用场景:

文件或者视频加密

加密比特币私钥

消息或者配置项加密

SSL通信加密

对称分组加密

使用异或实现一个简易的对称加密算法

A明文 B秘钥
AB=密文AB
(AB)B =A

密码补全和初始化
数据补全策略:PADDING_PKCS7(补其他) PADDING_ZERO(补0)

举例:

block = 8

12345678 9
12345678 90000000 ZERO

12345678 97777777 PKCS7

更详细请看:DES加密初探 - 乙太的小屋 (52ying.top)DES算法填充方式

#include <iostream>

using namespace std;


//对称加解密数据
//@para data 输入数据
//@para data_size 输入数据大小
//@para out 输出数据
//@para pass 密钥
//@para pass_size 密钥长度
//@return  加解密后数据大小
#define XOR_BLOCK 8
int XorCipher(const unsigned char* data, int data_size,
	unsigned char* out,
	const unsigned char* pass,
	int pass_size
) 
{
	static const char iv[] = "abcdefgt";
	//初始化密钥
	auto p = *(unsigned long long*)iv;
	//密钥补全,并且异或初始化向量
	//密钥小于XOR_BLOCK或者大于XOR_BLOCK
	for (int i = 0; i < pass_size; i += XOR_BLOCK)
	{
		unsigned long long tmp = 0;
		int size = XOR_BLOCK;
		//密钥小于 XOR_BLOCK
		if (pass_size - i < XOR_BLOCK) {
			size = pass_size - i;
		}
		memcpy(&tmp, (pass + i), size);
		p = (p ^ tmp);
	}

	//数据源转换成8字节数据类型
	auto d = (unsigned long long*)data;
	//输出数据
	auto o = (unsigned long long*)out;
	//数据分组处理
	int i = 0;
	for (; i < data_size / XOR_BLOCK; i++)
	{
		o[i] = (d[i] ^ p);
	}
	//输入数据的补充
	int mod = data_size % XOR_BLOCK;
	if (mod != 0)
	{
		unsigned long long tmp = 0;
		memcpy(&tmp, (d + i), mod);
	}

	int re_size = data_size;
	return re_size;
}

int main1(int argc, char* argv[])
{
	unsigned char data[] = "测试加解密数据TEST123测试";
	unsigned ch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是乙太呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值