异或加密是一种对称加密算法,通常用于加密二进制数据。异或操作的本质是对两个二进制数字进行比较,如果它们相同则返回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 异或加密传输的更多相关文章

  1. qt+boost::asio+tcp文件传输

    客户端: void qt_boost::pbSendFileClicked(){ QString filename = ui.leFileName->text(); QByteArray ba ...

  2. BOOST.Asio——Overview

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

  3. boost::asio译文

        Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...

  4. Boost.Asio技术文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  5. 09-OpenLDAP加密传输配置

    OpenLDAP加密传输配置(CA服务器与openldap服务器异机) 阅读视图 环境准备 CA证书服务器搭建 OpenLDAP服务端与CA集成 OpenLDAP客户端配置 客户端测试验证 故障处理 ...

  6. boost::asio 的同、异步方式

    转自:http://blog.csdn.net/zhuky/archive/2010/03/10/5364574.aspx Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C ...

  7. boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转

    一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_w ...

  8. 分享如何使用PHP将URL地址参数进行加密传输提高网站安全性

    大家在使用PHP进行GET或POST提交数据时,经常会在URL带着参数进行传递,比如www.mdaima.com/get.php?id=1&page=5,这里就将id编号和page页码进行了参 ...

  9. RSA加密传输代码示例

    RSA加密传输代码示例 涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了.服务端可以保留自己的私钥,发给客户端对应的公钥.这样就可以互相加解密了.php中rsa加解密实现: ...

  10. boost Asio网络编程简介

    :first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...

随机推荐

  1. MM01 物料主数据批导

    1业务场景 期初批量导入物料主数据时,有以下要求: 维护相应的物料视图 将物料维护到多个工厂 可能需要对物料进行分割评估 对某些字段,需要在BAPI中做增强处理进行维护 2代码实现 2.1物料基本数据 ...

  2. OS | 透过 inode 来理解硬链接和软链接

    什么是inode? 每个文件都对应一个唯一的inode,inode用来存储文件的元信息,包括: 对应的文件 文件字节数 文件数据块的位置 文件的inode号码 文件的硬链接数 文件的读写权限 文件的时 ...

  3. uni-app app定位当前地理位置

    https://blog.csdn.net/HXH_csdn/article/details/112258398?utm_medium=distribute.pc_relevant.none-task ...

  4. 单线程 Redis 如此快的 4 个原因

    本文翻译自国外论坛 medium,原文地址:https://levelup.gitconnected.com/4-reasons-why-single-threaded-redis-is-so-fas ...

  5. freeswitch的多租户模式

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 现在的VOIP服务越来越倾向于云端服务,包括呼叫中心云服务,线路云平台. 而云平台对多个客户的服务就需要做好隔离,包括数据隔离.线路 ...

  6. C#排序算法3:插入排序

    插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的.记录数增1的有序表. 原理: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已 ...

  7. 《DREEAM Guiding Attention with Evidence for Improving Document-Level Relation Extraction》阅读笔记

    代码   原文地址   预备知识: 1.什么是K-L散度(Kullback-Leibler Divergence)? K-L散度,是一种量化两种概率分布P和Q之间差异的方式,又叫相对熵.在概率学和统计 ...

  8. Nacos源码 (4) 配置中心

    本文阅读nacos-2.0.2的config源码,编写示例,分析推送配置.监听配置的原理. 客户端 创建NacosConfigService对象 Properties properties = new ...

  9. Scan Synthesis Practice

    不同上升沿触发器如何进行scan chain DFT实例 Synopsys 工具文档 Mentor DFT脚本 add_clocks 0 clk - 0表示上升沿 Synopsys DFT脚本 更改n ...

  10. 08-逻辑仿真工具VCS-mismatch

    逻辑仿真工具VCS mismatch,预计的仿真结果和实际仿真结果不同,寻找原因? 首先考虑代码,,不要让代码跑到工具的盲区中 其次考虑仿真工具的问题 +race -- 将竞争冒险的情况写到文件中 不 ...