异或加密是一种对称加密算法,通常用于加密二进制数据。异或操作的本质是对两个二进制数字进行比较,如果它们相同则返回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; }
|
读者可自行编译并运行上述代码片段,服务端主要用于解密输出,而客户端则用于加密并发送,需要注意两者的密钥一定要一致,否则将会出现无法解密出正确明文。