自己编写基于XOR(异或)操作的对称加密和解密的算法实现方法
#include<iostream>
#include<cstring>
using namespace std;
#define XOR_BLOCK 8
void PrintHex(const unsigned char* data, int size) {
for (int i = 0; i < size; ++i) {
printf("%02x", data[i]);
}
printf("\n");
}
int XorCipher(const unsigned char* data, int data_size,
unsigned char *out,
const unsigned char *pass,
int pass_size)
{
static const char iv[] = "abcdefgh";
unsigned long long p = *(unsigned long long*)iv; // 初始化秘钥
// 处理秘钥并与初始化向量异或
for (int i = 0; i < pass_size; i += XOR_BLOCK)
{
unsigned long long tmp = 0;
int size = XOR_BLOCK;
if (pass_size - i < XOR_BLOCK)
{
size = pass_size - i;
}
memcpy(&tmp, (pass + i), size);
p = (p ^ tmp); // 更新p
}
// 数据源转换成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); // XOR异或运算
}
// 处理补充数据(不足8字节时)
int mod = data_size % XOR_BLOCK;
if (mod != 0)
{
unsigned long long tmp = 0;
memcpy(&tmp, (d + i), mod);
o[i] = (tmp ^ p);
}
return data_size; // 返回加解密后的数据大小
}
int main(int argc, char* argv[])
{
unsigned char data[] = "测试加解密数据TEST123测试秘钥";
unsigned char out[1024] = { 0 };
unsigned char out2[1024] = { 0 };
unsigned char pass[] = "12345678";
int pass_size = strlen((char*)pass);
int len = XorCipher(data, sizeof(data) - 1, out, pass, pass_size); // 加密
cout << "Encrypted size: " << len << " | Encrypted data: ";
PrintHex(out, len);
len = XorCipher(out, len, out2, pass, pass_size); // 解密
cout << "Decrypted size: " << len << " | Decrypted data: ";
PrintHex(out2, len);
return 0;
}
注意,这个示例代码只是简单的异或加解密,而实际生产环境中需要更加安全的算法(如AES)来处理敏感数据。
1300

被折叠的 条评论
为什么被折叠?



