19.8 Boost Asio 异或加密传输
异或加密是一种对称加密算法,通常用于加密二进制数据。异或操作的本质是对两个二进制数字进行比较,如果它们相同则返回0,如果不同则返回1。异或加密使用一把密钥将明文与密文进行异或运算,从而产生密文。同时,使用相同的密钥进行解密将返回原始的明文数据。在异或加密中,加密和解密使用的是相同的密钥。因此,它是一种对称加密算法。由于其简单性和效率,其经常用于嵌入式系统中。
首先实现服务端部分,在服务端中我们通过实现Makecode函数,其可用于将特定的一段字符串异或处理,在本案例中服务端通过传入一段加密后的字符串以及一个pkey密钥对,则可实现解密操作,当服务端接收到结构体后,可直接使用该函数对数据包进行解密。
#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将加密后的数据包通过网络传输即可。
#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;
}
读者可自行编译并运行上述代码片段,服务端主要用于解密输出,而客户端则用于加密并发送,需要注意两者的密钥一定要一致,否则将会出现无法解密出正确明文。

19.8 Boost Asio 异或加密传输的更多相关文章
- qt+boost::asio+tcp文件传输
客户端: void qt_boost::pbSendFileClicked(){ QString filename = ui.leFileName->text(); QByteArray ba ...
- BOOST.Asio——Overview
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
- boost::asio译文
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...
- Boost.Asio技术文档
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
- 09-OpenLDAP加密传输配置
OpenLDAP加密传输配置(CA服务器与openldap服务器异机) 阅读视图 环境准备 CA证书服务器搭建 OpenLDAP服务端与CA集成 OpenLDAP客户端配置 客户端测试验证 故障处理 ...
- boost::asio 的同、异步方式
转自:http://blog.csdn.net/zhuky/archive/2010/03/10/5364574.aspx Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C ...
- boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转
一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_w ...
- 分享如何使用PHP将URL地址参数进行加密传输提高网站安全性
大家在使用PHP进行GET或POST提交数据时,经常会在URL带着参数进行传递,比如www.mdaima.com/get.php?id=1&page=5,这里就将id编号和page页码进行了参 ...
- RSA加密传输代码示例
RSA加密传输代码示例 涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了.服务端可以保留自己的私钥,发给客户端对应的公钥.这样就可以互相加解密了.php中rsa加解密实现: ...
- boost Asio网络编程简介
:first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...
随机推荐
- C++11实用特性3 --智能指针
1 智能指针 在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针的 ...
- Centos7 cmake版本升级(v2.8.12.2->v3.16.6)
1. 查看当前cmake版本 [root@localhost ~]# cmake -version cmake version 2.8.12.2 2. 进行卸载 [root@localhost ~]# ...
- 【HZERO】报表服务
报表服务 参考文档 https://open.hand-china.com/document-center/doc/component/181/12455?doc_id=10088&_back ...
- 如何在CSDN上如何快速转载博客
复制粘贴应该是最显而易见的方法,但是不仅会有丢失内容,而且格式也会丢失.要想达到更好的效果,可以从html源码入手. 1.在chrome浏览器中打开要转载的文章,右键选择检查(or使用F12) 2.在 ...
- 【AcWing】第6场周赛 B题 3734. 求和 (思维)
AcWing 3734. 求和 其实这道题并不难,只是思维性很强! 因为 \(a\) 的各个数位不包含除了 \(4\) 和 \(7\) 以外的其他数字. 仔细观察数据会发现因为 \(1\le l \ ...
- C++ tuple(STL tuple)模板用法详解
tuple 是C++ 11新引进的 build-in structure,但其实在其他语言中tuple的使用已经行之有年(e.g. Javascript和Python中都有tuple).C++ 11中 ...
- SpringCloud学习 系列三、 创建一个没有使用springCloud的服务提供者和消费者
系列导航 SpringCloud学习 系列一. 前言-为什么要学习微服务 SpringCloud学习 系列二. 简介 SpringCloud学习 系列三. 创建一个没有使用springCloud的服务 ...
- 《3D编程模式》写书-第2次记录
大家好,目前我已经完成了"拼接模式"."撤销重做模式"."ECS模式"的初稿 下面会给出它们的使用场景,如果您正好能用到,请联系我提前阅读模 ...
- 2023年AI领域行业洞察,看这30个统计数据就够了!
PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. 随着AIGC的爆火,企业越来越多地开始采用生成式人工智能.自然语 ...
- [转帖]oracle中Rman增量备份下各级别level的区别
RMAN备份分为全备和增量备份两部分 增量备份:分为0 1 2级 ORACLE官方解释: A level 1 incremental backup can be either of the foll ...