异或加密是一种对称加密算法,通常用于加密二进制数据。异或操作的本质是对两个二进制数字进行比较,如果它们相同则返回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. 手把手教你搭建深度学习开发环境(Tensorflow)

    前段时间在阿里云买了一台服务器,准备部署网站,近期想玩一些深度学习项目,正好拿来用.TensorFlow官网的安装仅提及Ubuntu,但我的ECS操作系统是 CentOS 7.6 64位,搭建Pyth ...

  2. CNCF大使预测:2024年云原生面临倦怠、离职及云成本精简

    本文由 CNCF 大使 Eric D. Schabell 撰写,预测2024年云原生领域最可能发生的3大变化,并与其对云原生可观测性领域的见解结合. 关注云原生倦怠 毫无疑问,在 2023 年中云原生 ...

  3. kafka如何保证数据的消息不丢失(最简洁)

    一.kafka 本身配置层面1.1.replication.factor 默认值1创建kafka的topic时候,每个分区设置的副本数, 根据broker数量酌情设置, 建议业界通常做法设置为3 1. ...

  4. springboot启动后异步启动一个程序

    如果你想在 Spring Boot 启动后异步方式启动一个方法,你可以使用 Spring Framework 的异步支持和 @Async 注解来实现.以下是如何在 Spring Boot 应用程序中异 ...

  5. <vue 路由 2、router-link标签属性>

    说明:在上一节的工程下继续讲解 一.     知识点说明 上一节中, <router-link>我们只是使用了一个属性: to, 用于指定跳转的路径.<router-link> ...

  6. vue-asome-swiper

  7. mongodb导入本地json文件

  8. java进阶(28)--Map集合

    一.Map简介: 1.Map与collection没有继承关系 2.Map集合以key与value的方式存储数据   二.常用方法: 1.void clear():清空Map集合

  9. Guava缓存工具类封装和使用

    本文为博主原创,未经允许不得转载: Guava是谷歌提供的一款强大的java工具库,里面包含了很多方便且高效的工具,在项目开发中有业务场景需要保存数据到内存当中, 且只需要保存固定时间就可以,该数据只 ...

  10. 基于python的视频点播网站(python+django+vue开发的视频点播网站-视频管理系统)

    演示地址 前台地址: http://video.gitapp.cn 后台地址:http://video.gitapp.cn/admin 后台管理帐号: 用户名:admin123 密码:admin123 ...