- 对称分组加密常用算法:
·DES
·3DES
·AES
·国密SM4
- 对称分组加密应用场景:
文件或者视频加密
加密比特币私钥
消息或者配置项加密
SSL通信加密
对称分组加密
使用异或实现一个简易的对称加密算法
A明文 B秘钥
AB=密文AB
(AB)B =A
密码补全和初始化
数据补全策略:PADDING_PKCS7(补其他) PADDING_ZERO(补0)举例:
block = 8
12345678 9
12345678 90000000 ZERO12345678 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