本demo主要是openssl中Diffie-Hellman,HAMC,AES的简单应用,谨供参考(文章最后有demo的下载)。

首先,demo的大概情况:

·openssl版本为openssl-1.0.1g-32bit-debug-vs2013(IDE是vs2013)

·使用MFC对话框的CAsyncsocket进行简单交互

·主要流程:

1)密钥协商。Client发起密钥协商请求,Server相应请求,并完成一次DH密钥交换过程。
     2)身份认证。Server放提出认证请求,Client用协商出来的密钥对一个口令作用产生一个MAC发送给Server,Server根据口令进行认证。
     3)报文发送。有一个文本输入窗,输入要通信的明文。按“发送”则报文明文发送;按“加密发送”按钮则加密并发送到对方。接收方收到密文,点击按钮可以解密;如果收到的是普通报文则直接显示在文本框。

流程图:

主要代码结构:

SCSocket                ------------------------------  服务端socket

SCClientSocket       -------------------------------客户端socket

SCHandler              -------------------------------下面三个类的父类

SCDHHandler         -------------------------------Diffie-Hellman相关的操作(生成参数,选取秘钥,计算共享密钥)都在此类中

SCHMACHandler   -------------------------------生成HMAC消息认证码

SCAESHandler       ------------------------------- AES加密

XXXDlg                   -------------------------------显然负责界面

有关CASyncsocket的使用可参考: 一个CAsyncSocket例子

当socket收到消息,统一调用:

void SCClientSocket::OnReceive(int nErrorCode)
{
<span style="white-space:pre"> </span>// TODO: Add your specialized code here and/or call the base class
<span style="white-space:pre"> </span>pDlg->OnRecv(this);
<span style="white-space:pre"> </span>CAsyncSocket::OnReceive(nErrorCode);
}

pDlg->OnRecv :

void CSecureChatServerDlg::OnRecv(SCClientSocket * pConn)
{if (NULL != pConn){char rcvBuf[513] = { 0 };int nRcved = 0;nRcved = pConn->Receive(rcvBuf, 512);if (SOCKET_ERROR != nRcved){clientSocket->handler->processMessageFromConnection(rcvBuf, clientSocket);}}
}

不管收到什么信息,都是调用 clientSocket->handler->processMessageFromConnection(rcvBuf, clientSocket);

SCClientSocket定义如下:

class SCClientSocket : public CAsyncSocket
{
public:SCClientSocket();virtual ~SCClientSocket();virtual void OnConnect(int nErrorCode);virtual void OnClose(int nErrorCode);virtual void OnReceive(int nErrorCode);void send(unsigned char * data);CSecureChatServerDlg * pDlg;SCHandler * handler;
};

SCHandler中定义了两个虚函数:

 virtual void processMessageFromConnection(char * data, SCClientSocket *conn){// should never call me!}virtual void start(SCClientSocket *conn,int flag){// should never call me!}

保存了SCHandler * handler 指针,随着交互流程的推进,handler可以依次指向SCDHHandler,SCHMACHandler,SCAESHandler的实例(通过调用void start(SCClientSocket *conn,int flag)改变handler所指的对象)。SCHandler的子类覆盖了上面两个虚函数,因此会调用各自的 void processMessageFromConnection(char * data, SCClientSocket *conn) 处理各自的消息。

为了标识当前的交互状态,在每个消息前面插入一个字节标记当前消息的内容:

例如SCDHHandler的processMessageFromConnection函数内容如下:

void SCDHHandler::processMessageFromConnection(char * data, SCClientSocket *conn)
{char DHType = data[0];switch ((int)DHType){case RECV_A:  // 收到DH参数a(即本原根){......break;}case RECV_Q:  // 收到DH参数q (大整数){......break;}case RECV_Q_RESPON:  // 对方收到q发回的回应{......break;}case RECV_SERVER_PUBLIC_KEY:  // 收到服务器的公开量,只会在客户端程序触发{......break;}case RECV_CLIENT_PUBLIC_KEY:  // 收到客户端的公开量,只会在服务器程序触发{......break;}default:AfxMessageBox(_T("diffie hellman error occur"));break;}
}

SCHMACHandler 和 SCAESHandler的代码结构也是如上所示。

具体代码可查看:demo下载

参考:

另外,openssl的库是直接用别人编译好的(自己编了几次都失败了):

http://p-nand-q.com/programming/windows/building_openssl_with_visual_studio_2013.html

aes例子:

https://github.com/rockyxshen/block_cipher/blob/master/aescipher.c

基于openssl的计算机安全学demo(包含Diffie-Hellman,HAMC,AES的简单应用)相关推荐

  1. 浅谈基于openssl的多级证书,Multi-level CA的签发和管理,以及双向认证

    最近在研究openssl签发证书,在网上搜索关于openssl的用法.资料等等,总觉得非常分散,而且讲得比较浅,文章虽然不少,但是缺少真正能给你讲的明白得,仅停留在"能用"上,感慨 ...

  2. openssl-key-exchange 基于ECDH (Elliptic-Curve Diffie–Hellman) 的密钥交换流程

    openssl-key-exchange 本文摘自我在GitHub的开源项目 https://github.com/zhoupeng6d/openssl-key-exchange 简介 该方案介绍一种 ...

  3. 基于OpenSSL自建CA和颁发SSL证书

    关于SSL/TLS介绍见文章 SSL/TLS原理详解. 关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三 ...

  4. NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示

    2019独角兽企业重金招聘Python工程师标准>>> 前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目 ...

  5. 基于 OpenSSL 生成自签名证书,数字签名,泛域名证书,ca证书,PKI等

    基于 OpenSSL 生成自签名证书_qhh0205-CSDN博客_openssl自签名证书 windows 下 nginx 双向认证自签名证书配置 windows 下 nginx 双向认证自签名证书 ...

  6. 基于OpenSSL的CA建立及证书签发(签发多域名/IP)

    自签SSL证书(多域名/IP) 本文基于以下环境: 内核信息:Linux zabbix 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 ...

  7. (附源码)基于SpringBoot小而学在线考试系统 毕业设计141507

    基于springboot小而学在线考试系统 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最 ...

  8. mysql基于SpringBoot小而学在线考试系统毕业设计源码141507

    基于springboot小而学在线考试系统   摘  要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是 ...

  9. 基于openssl工具完成自建CA以及为server,client颁发证书

    文章目录 一.openssl简介 1.1 主要构成部分 1.2 openssl用途 1.3 证书.密钥.CSR请求文件.CRL列表 查看命令 二.RSA密钥操作 2.1密钥生成 2.2 转换命令 2. ...

最新文章

  1. Fedora 31 Beta 准时发布,带来许多激动人心的更新
  2. 【机器学习】深刻理解决策树-动手计算ID3算法
  3. keras中的神经网络为什么需要多次epoch
  4. 用 GDI 操作 EMF 文件[6]: GetEnhMetaFileHeader - 获取 EMF 的头文件
  5. Spring集成PageHelper的简单用法
  6. 验毛坯房要注意什么?
  7. cake-build -.Net Core 跨平台构建自动化系统
  8. 针对xml文件做提取与写入的操作
  9. memcache/redis 缓存学习笔记
  10. Oracle 执行长SQL
  11. 多生产者_【并发那些事】生产者消费者问题
  12. 将adb命令打包成脚本
  13. 2021 Alexa SmartHome Skill 对接(二)配置及服务对接
  14. 20多岁,你迷茫又着急
  15. 小感之绝知此事要躬行
  16. TensorFlow问题:FLAGS._parse_flags()报错AttributeError:_parse_flags
  17. OS=Windows OS=Windows and the assembly descriptor contains a *nix-specific root-relative-reference
  18. 两边同时取对数求复合函数_等式两边同时取对数,什么条件下能同时取对数??...
  19. t420i升级固态硬盘提升_升级旧机子,为何首选升级固态硬盘?
  20. 赛事简介 |香港科大-杰瑞集团 2022【人工智能】百万奖金国际创业大赛

热门文章

  1. CocosCreator之Animation动画组件
  2. ITIL,是否已是昨日黄花
  3. 这10个小技巧,让你的Python数据分析加速50%!
  4. 卸载Navicat!操作所有的数据库靠它就够了
  5. vscode 在编写c++时候报“在 browse.path 中未找到包含文件”
  6. IT傻博士-CCNA课程在线视频(1-5)
  7. 验证选举后继路由和可行后继路由的实时性[IT傻博士原创]
  8. 火爆外网的ChatGPT,改Bug,敲代码不在话下
  9. FEST-Swing 1.2发布
  10. 【学术篇】SDOI2008 山贼集团