在读者了解了加密算法的具体使用流程后,那么我们就可以使用这些加密算法对网络中的数据包进行加密处理,加密算法此处我们先采用AES算法,在网络通信中,只需要在发送数据之前对特定字符串进行加密处理,而在接收到数据后在使用相同的算法对数据进行恢复即可,读者如果有了套接字编程的基础,那么理解这段代码将变得很容易。

首先来看服务端代码片段,服务端在接受数据之前通过初始化aes_key变量设置一个加密密钥,在收到recv()数据后,直接调用AES函数实现解密,当解密完成后则直接输出原始字符串。

#include <iostream>
#include <winsock2.h>
#include <WS2tcpip.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <openssl/aes.h>
#include <openssl/crypto.h> extern "C"
{
#include <openssl/applink.c>
} #pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"libssl_static.lib")
#pragma comment(lib,"libcrypto.lib") // AES加密与解密
void AES(unsigned char* InBuff, unsigned char* OutBuff, unsigned char* key, char* Type)
{
if (strcmp(Type, "encode") == 0)
{
AES_KEY AESEncryptKey;
AES_set_encrypt_key(key, 256, &AESEncryptKey);
AES_encrypt(InBuff, OutBuff, &AESEncryptKey);
}
else if (strcmp(Type, "decode") == 0)
{
AES_KEY AESDecryptKey;
AES_set_decrypt_key(key, 256, &AESDecryptKey);
AES_decrypt(InBuff, OutBuff, &AESDecryptKey);
}
} int main(int argc, char* argv[])
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2, 0), &WSAData); SOCKET server_socket;
server_socket = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in ServerAddr;
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(9999);
ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); bind(server_socket, (LPSOCKADDR)&ServerAddr, sizeof(ServerAddr));
listen(server_socket, 10); SOCKET message_socket;
if ((message_socket = accept(server_socket, (LPSOCKADDR)0, (int*)0)) != INVALID_SOCKET)
{
// 生成AES密钥
unsigned char aes_key[32] = { 0x11,0x22,0x33,0x44 }; // 使用RSA私钥加密AES的密钥,并发给客户端
char* encrypt = nullptr;
int encrypt_length = 0; // 接收客户端发来的AES数据,解密输出
unsigned char Buffer[1024] = {0};
unsigned char DecodeBuf[1024] = { 0 }; recv(message_socket, (char *)Buffer, 1024, 0);
std::cout << "接收加密长度: " << strlen((char *)Buffer) << std::endl; AES(Buffer, DecodeBuf, aes_key, (char*)"decode");
std::cout << "解密内容: " << DecodeBuf << std::endl; }
closesocket(server_socket);
WSACleanup(); system("pause");
return 0;
}

接着是客户端代码,如下所示,首先设置aes_key密钥对,此处需要保持服务端与客户端密钥的一致性,在发送数据之前先调用AES算法对字符串进行加密处理,接着在调用send函数将加密后的字节序传输到服务器端。

#include <iostream>
#include <winsock2.h>
#include <WS2tcpip.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <openssl/aes.h>
#include <openssl/crypto.h> extern "C"
{
#include <openssl/applink.c>
} #pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"libssl_static.lib")
#pragma comment(lib,"libcrypto.lib") // AES 加密与解密
void AES(unsigned char* InBuff, unsigned char* OutBuff, unsigned char* key, char* Type)
{
if (strcmp(Type, "encode") == 0)
{
AES_KEY AESEncryptKey;
AES_set_encrypt_key(key, 256, &AESEncryptKey);
AES_encrypt(InBuff, OutBuff, &AESEncryptKey);
}
else if (strcmp(Type, "decode") == 0)
{
AES_KEY AESDecryptKey;
AES_set_decrypt_key(key, 256, &AESDecryptKey);
AES_decrypt(InBuff, OutBuff, &AESDecryptKey);
}
} int main(int argc, char* argv[])
{
WSADATA WSAData;
WSAStartup(MAKEWORD(2, 0), &WSAData);
SOCKET client_socket;
client_socket = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in ClientAddr;
ClientAddr.sin_family = AF_INET;
ClientAddr.sin_port = htons(9999);
ClientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(client_socket, (LPSOCKADDR)&ClientAddr, sizeof(ClientAddr)) != SOCKET_ERROR)
{
unsigned char aes_key[32] = { 0x11,0x22,0x33,0x44 }; // 使用AES加密数据,并发送给服务端
char Buffer[1024] = "hello lyshark";
unsigned char EncodeBuf[1024] = { 0 }; AES((unsigned char *)Buffer, EncodeBuf, aes_key, (char*)"encode");
std::cout << "发送加密长度: " << strlen((char *)EncodeBuf) << std::endl;
send(client_socket, (char *)EncodeBuf, 1024, 0); closesocket(client_socket);
WSACleanup();
} system("pause");
return 0;
}

读者可自行编译上方代码,首先运行服务端然后再运行客户端,至此数据会被加密传输到对端,并使用相同的方式解密,如下图所示;

20.4 OpenSSL 套接字AES加密传输的更多相关文章

  1. openssl与cryptoAPI交互AES加密解密

    继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...

  2. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  3. socket套接字TCP协议传输-案例测试

    术语: 套接字接口:socket,是一个IP地址和一个端口号的组合,套接字可以唯一标识整个Internet中的一个网络进程. TCP连接:一对套接字接口(一个用于接收,一个用于发送)可定义面向连接的协 ...

  4. thrift之TTransport层的堵塞的套接字I/O传输类TSocket

    本节将介绍第一个实现具体传输功能的类TSocket,这个类是基于TCP socket实现TTransport的接口.下面具体介绍这个类的相关函数功能实现. 1.构造函数 分析一个类的功能首先看它的定义 ...

  5. python基础--基于套接字进行文件传输、异常处理、socketserver模块

    异常处理: 什么是异常处理: 程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来,造成的影响就是整个程序无法再正常运行 异常的结构: 异常的类型.异常的信 ...

  6. JS和利用openssl的object C加密得到相同的aes加密密文

    这是之前接到的一个工作内容,项目原本的登录操作是获得账号和密码以后,对密码进行一遍MD5加密,然后传递账号和密文到cgi文件.在c中获取到账户以后,从数据库中获取到密码,对密码进行一次MD5的加密,然 ...

  7. linux原始套接字(3)-构造IP_TCP发送与接收

    一.概述                                                    tcp报文封装在ip报文中,创建tcp的原始套接字如下: sockfd = socket ...

  8. 计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信

    所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲,套接字上联应 ...

  9. Java套接字

    前言: 本文补充一下Java关于套接字方面的内容,因为其应用相对比较简单,所以下面介绍两个程序实例. ------------------------------------------------- ...

  10. linux学习笔记之套接字

    一.基础知识. 1:套接字基础. 1,是通信端点的抽象. 2,在UNIX类系统中被当作是一种文件描述符. 3,套接字通信域. 域 描述 AF_INET IPV4因特网域 AF_INET6 IPV6因特 ...

随机推荐

  1. ITS实现可滚动表格

    一.ITS不支持TableControl 在ITS条码开发中,遇到需要滚动浏览表格的需求,但是在ITS中是不支持TableControl,并且已经验证在PDA中显示ALV行不通,因为ALV条目过多无法 ...

  2. 一次惨痛教训让我写了个Windows定期备份文件脚本

    前言 说实话在写这篇文章的时候,咸鱼不禁又想起了那件男默女泪的往事   我喜欢做笔记,我觉得好记性不如烂笔头,所以在我的学生以及职业生涯阶段,我用过四款笔记应用--Onenote.语雀.印象笔记.Ty ...

  3. AtCoder Beginner Contest 208 A~E个人题解

    比赛链接:Here A - Rolling Dice 水题 一个六面的骰子,请问摇动 \(A\) 次最后的点数和能否为 \(B\) 如果 \(B \in [a,6a]\) 输出 YES C++ voi ...

  4. 10、SpringBoot-mybatis-plus-druid多源数据

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...

  5. <vue 路由 8、keep-alive的使用>

    一.     知识点 1.什么是keep-alive? keep-alive是Vue.js的一个内置组件. 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.它自身不会渲染一个 DOM 元素,也 ...

  6. C#设计模式09——组合模式的写法

    1. 什么是C#组合模式? 组合模式是一种结构型设计模式,它允许将对象组合成树形结构以表示"整体/部分"层次结构.使用此模式,客户端可以按相同的方式处理单个对象和对象集合,而不必关 ...

  7. python之logging日志

    一.logging介绍: 使用 logging.debug(text)来打印信息,info等的使用方法与debug一致,都只有一个位置参数 默认日志界别为:会输出warning以上的信息,代码示例: ...

  8. 使用zipFile读取文件时遇到的问题及解决(KeyError: "There is no item named 'xxx' in the archive")

    问题描述 在Windows上跑一段代码时,遇到如下问题: KeyError: "There is no item named 'CDR_Data\\\\CDR.Corpus.v010516\ ...

  9. Elastic学习之旅 (2) 快速安装ELK

    大家好,我是Edison. 上一篇:初识ElasticSearch ElasticSearch的安装方式 ElasticSearch可以有多种安装方式,比如直接下载安装到宿主机进行运行,也可以通过do ...

  10. 基于Tensorflow技术开发的计算机毕业设计辅助生成器(使用AI大模型技术)

    这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码.它基于几百个github上面开源的java和python项目,运用tensorflow技术,训练出了AI大模型.基本实现了计算机毕业设 ...