19.8 Boost Asio 异或加密传输

异或加密是一种对称加密算法,通常用于加密二进制数据。异或操作的本质是对两个二进制数字进行比较,如果它们相同则返回0,如果不同则返回1。异或加密使用一把密钥将明文与密文进行异或运算,从而产生密文。同时,使用相同的密钥进行解密将返回原始的明文数据。在异或加密中,加密和解密使用的是相同的密钥。因此,它是一种对称加密算法。由于其简单性和效率,其经常用于嵌入式系统中。

首先实现服务端部分,在服务端中我们通过实现Makecode函数,其可用于将特定的一段字符串异或处理,在本案例中服务端通过传入一段加密后的字符串以及一个pkey密钥对,则可实现解密操作,当服务端接收到结构体后,可直接使用该函数对数据包进行解密。

c 复制代码
#include <iostream>
#include <boost/asio.hpp>

typedef struct
{
  int uuid;
  char uname[1024];
}message;

using namespace boost::asio;

// 定义异或解密过程
char MakecodeChar(char c, int key)
{
  return c = c^key;
}

void Makecode(char *pstr, int *pkey)
{
  int len = strlen(pstr);
  for (int i = 0; i<len; i++)
    *(pstr + i) = MakecodeChar(*(pstr + i), pkey[i % 5]);
}

int main(int argc, char* argv[])
{
  io_service io_service;
  ip::tcp::acceptor acceptor(io_service, ip::tcp::endpoint(ip::tcp::v4(), 6666));
  ip::tcp::socket socket(io_service);

  acceptor.accept(socket);
  boost::system::error_code error_code;

  // 定义接收结构
  char recv_buffer[sizeof(message) * 2] = { 0 };
  socket.read_some(boost::asio::buffer(recv_buffer, sizeof(message) * 2), error_code);

  // 收到数据后使用异或解密数据包
  int key[] = { 1024, 2589, 3178, 5569, 9658 };
  Makecode(recv_buffer, key);

  // 强转为指针
  message *msg = (message *)recv_buffer;
  std::cout << "获取解密结构体数据: " << msg[0].uname << std::endl;

  std::system("pause");
  return 0;
}

接着来看一下客户端代码的实现流程,针对客户端实现当我们构建好一个结构体msg时,通过memcpy函数将该结构体复制到一块缓冲区内,接着调用Makecode并传入密钥对,该函数可将这段字符串异或处理并写回到原始缓冲区内,此时直接调用write_some将加密后的数据包通过网络传输即可。

c 复制代码
#include <iostream>
#include <boost/asio.hpp>

using namespace boost::asio;

typedef struct AddrInfo
{
  int uuid;
  char uname[1024];
}message;

// 定义异或加密过程
char MakecodeChar(char c, int key)
{
  return c = c^key;
}

void Makecode(char *pstr, int *pkey)
{
  int len = strlen(pstr);
  for (int i = 0; i<len; i++)
    *(pstr + i) = MakecodeChar(*(pstr + i), pkey[i % 5]);
}

message msg[2];

int main(int argc, char* argv[])
{
  io_service io_service;
  ip::tcp::socket socket(io_service);
  ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 6666);

  boost::system::error_code error_code;
  socket.connect(ep, error_code);

  // 定义发送变量
  char send_buffer[sizeof(message) * 2] = { 0 };

  // 将数据拷贝到结构中
  msg[0].uuid = 100;
  strcpy(msg[0].uname, "lyshark");

  msg[1].uuid = 200;
  strcpy(msg[1].uname, "admin");
  memcpy(send_buffer, &msg, sizeof(message) * 2);

  // 使用异或加密发送数据包
  int key[] = { 1024, 2589, 3178, 5569, 9658 };
  Makecode(send_buffer, key);

  // 加密后发送给服务端
  socket.write_some(boost::asio::buffer(send_buffer, sizeof(message) * 2));

  std::system("pause");
  return 0;
}

读者可自行编译并运行上述代码片段,服务端主要用于解密输出,而客户端则用于加密并发送,需要注意两者的密钥一定要一致,否则将会出现无法解密出正确明文。

相关推荐
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
hikktn5 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
观音山保我别报错5 小时前
C语言扫雷小游戏
c语言·开发语言·算法
小林熬夜学编程8 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
墨墨祺8 小时前
嵌入式之C语言(基础篇)
c语言·开发语言
躺不平的理查德8 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
幼儿园园霸柒柒10 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
好想有猫猫10 小时前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节
摆烂小白敲代码11 小时前
背包九讲——背包问题求方案数
c语言·c++·算法·背包问题·背包问题求方案数