C++学习之密码学知识

目录

1.文档介绍

2.知识点概述

3.项目准备

4.序列化介绍

5.项目中基础组件介绍

6.基础模块在项目中作用

7.项目中其他模块介绍

8.加密三要素

9.对称加密和非堆成加密

10.对称和非对称加密特点

11.堆成加密算法des

12.des对称加密算法

13.对称加密算法aes

14.知识点回顾

15.秘钥分发过程

16.哈希值算法特点

17.常用哈希算法以及散列值长度

18.哈希值不可逆

19.消息认证码

20.数字签名和校验签名

21.openssl介绍

22.openssl介绍

23.vs下opensl的配置

24.openssl在Linux的安装


1.文档介绍

2.知识点概述

- 网络通信
  - 数据传输 -> 需要保证数据的安全性
    - 对数据加密
  - 项目1主要实现的功能:
    - 对网络通信数据进行加解密的模块

3.项目准备

基础组件
   - 数据序列化
   
     - google protobuf
   
     - 解决数据的跨平台传输
   
       - 字节序
   
       - 计算机位数
   
         - 32位
         - 64位
   
       - 字节对齐
   
         ```c
         struct A
         {
             int a;    // 4
             char b;    // 1
             char cc;
             int c;    // 4
         };
         ```

4.序列化介绍

  - 序列化 -> 编码
   
         - 将原始数据按照某种格式进行封装 -> 特殊的字符串
         - 将特殊字符串发送给对方
   
       - 反序列化 -> 解码
   
         - 接收到序列化的特殊字符串 -> 解析    -> 原始数据
         - 安装业务需求处理原始数据
   
   - 套接字通信
   
     - tcp
     - 线程池 -> 服务器端使用
     - 连接池 -> 客户端使用
       - 多线程的使用

5.项目中基础组件介绍

 - 共享内存操作 -> shm
   
     - 进程间通信的一种方式
     - 效率最高
       - 之前讲的进程间通信的方式都需要使用fd
         - 管道
           - 匿名 -> 不需要读磁盘
           - 有名 -> 需要磁盘文件
         - 本地套接字
         - 内存映射区 -> mmap
       - 不需要对磁盘文件进行操作
   
   - 数据库操作
   
     - 使用的oracle
     - 使用的oracle官方提供的c++接口
       - OCI

6.基础模块在项目中作用

 秘钥协商服务器 && 客户端

   - 客户端两种实现模式
     - 桌面程序 -> Qt
       - 需要将桌面创建搭建起来
       - 写的qt程序
         - 业务逻辑纯C/C++实现都是可以的
     - 终端交互 -> linux终端 -> 上课时候使用这个实现
   - 服务器 -> 后台的守护进程

3. 图形界面

   - Qt的配置管理终端

4. 加解密接口(外联接口)的封装

7.项目中其他模块介绍

 2.1 加密三要素

```sequence
note left of 明文: Encode
明文->密文: 加密算法+秘钥
密文-->明文: 解密算法+秘钥
note right of 密文: Decode
```

- 加密三要素:
  
  - 明文/密文
  
    - 明文 -> 原始数据
    - 密文 -> 加密之后的数据
  
  - 秘钥
  
    - 定长的字符串
    - 对称加密 ->自己生成
    - 非对称加密 -> 有对应的算法可以直接生成
  
  - 算法
  
    - 加密算法
    - 解密算法
  

8.加密三要素

 举例:
  
    ```c
    明文: 123
    秘钥: 111
    加密算法: 明文 + 秘钥    
    解密算法: 密文 - 秘钥
    
    加密:  123 + 111 = 密文 == 234
        
    解密: 234 - 11 = 明文 == 123
    ```

9.对称加密和非堆成加密

对称加密
  
  - 秘钥比较短
  - 秘钥只有一个
    - 加密解密使用的秘钥是相同的
  - 加密的效率高
  - 加密强度相对较低( 相对于非对称加密 )
  - 秘钥分发困难 -> 因为秘钥要保密不能泄露
    - `秘钥不能直接在网络环境中进行发送`
  
- 非对称加密
  
  - 秘钥比较长
  - 秘钥有两个, 所有的非对称加密算法都有生成密钥对的函数
    - 这两个秘钥对保存到不同的文件中, 一个文件是公钥(比较小), 一个是私钥(比较大)
    - 公钥   -> 可以公开的
    - 私钥  -> 不能公开
  - 加解密使用的秘钥不同
    - 如果使用公钥加密, `必须`私钥解密
    - 如果使用私钥加密, `必须`公钥解密
  - 效率低
  - 加密强度相对较高( 相对于对称加密 )
  - 秘钥可以直接分发 -> 分发的公钥
  
  

10.对称和非对称加密特点

## 3.1 对称加密  

- <font color="red">**DES/3DES**</font>
- DES  -> 已经被破解了, 不安全
    - 秘钥长度 8byte
  - 对数据分段加密, 每组8字节
    - 得到的密文和明文长度是相同的
  - 3DES -> 3重des
    - 安全的, 效率比较低
    - 对数据分段加密, 每组8字节
    - 得到的密文和明文长度是相同的  == 8字节
    - 秘钥长度24字节, 在算法内部会被平均分成3份, == 每份8字节
      - 看成是3个秘钥
      - 每个8字节
    - 加密处理逻辑:
      - 加密:     -> 秘钥1  * 加密算法
      - 解密     -> 秘钥2   * 解密算法
      - 加密     -> 秘钥3   * 加密算法
    - 三组秘钥都不同, 加密的等级是最高的
- <font color="red">**AES**</font>
  - 最安全, 效率最高的公开的对称加密算法
  - 秘钥长度: 16字节, 24字节, 32字节
    - 秘钥越长加密的数据越安全, 效率越低
  - `分组加密, 每组长度 16 字节`
  - 每组的密文和明文的长度相同  == 16byte
- Blowfish
- RC2/RC4/RC5
- IDEA
- SKIPJACK

11.堆成加密算法des

### 加密算法

- **RSA(数字签名和密钥交换)**
  - 项目中用的是rsa
- ECC(椭圆曲线加密算法 - 数字签名)
- Diffie-Hellman(DH, 密钥交换)
- El Gamal(数字签名)
- DSA(数字签名)

12.des对称加密算法

```c
// 假设通信的双方为: 客户端C, 服务器端S
// Wie什么要交换?
/*
    1. 非对称加密秘钥分发方便, 但是效率低 -> 改进: 需要使用对称加密
    2. 使用对称加密 -> 秘钥分发困难 -> 改进: 使用非对称加密进行秘钥分发
        - 分发是对称加密的秘钥, 本质就是一个字符串
*/

13.对称加密算法aes

// 秘钥交换的过程:
/*
    1. 在服务器端生成一个非对称加密的密钥对: 公钥, 私钥
    2. 服务器将公钥发送给客户端, 客户端有了公钥
    3. 在客户端生成一个随机字符串 -> 这就是对称加密需要使用的秘钥
    4. 在客户端使用公钥对生成的对称加密的秘钥进行加密 -> 密文
    5. 将加密的密文发送给服务器
    6. 服务器端使用私钥解密 -> 对称加密的秘钥
    7. 双方使用同一秘钥进行对称加密通信
*/
```

14.知识点回顾

> 特点: 
>
> - 不管原始数据有多长, 通过哈希算法进行计算, 得到的结果的长度是固定的
>   - 是一个二进制的字符串
> - 只要是原始数据不一样, 得到的结果就不一样
>   - 原始数据差一丢丢, 得到的结果也是完全不同的
> - 有很强的抗碰撞性
>   - 碰撞: 原始数据不同, 但是通过同样的哈希算法进行计算能得到相同的结果
>   - 推导的结论:
>    - 数据不同得到的结果就不同
>   - 应用场景:
>    - 数据校验
>     - 登录验证
>    - 秒传
> - 不可逆
>   - 得到的结果不能推导出原始数据

>哈希运算的结果:

>- 散列值
> - 指纹
> - 摘要

15.秘钥分发过程

>哈希运算的结果:

>- 散列值
> - 指纹
> - 摘要

- MD4/MD5
  - 散列值长度: 16字节
  - 抗碰撞性已经被破解
- SHA-1
  - 散列值长度: 20字节
  - 抗碰撞性已经被破解
- SHA-2
  - sha224
    - 散列值长度: 224bit / 8 = 28byte
  - sha256
    - 散列值长度: 256bit / 8 = 32byte
  - sha384
    - 散列值长度: 384bit / 8 = 48byte
  - sha512
    - 散列值长度: 512bit / 8 = 64byte
- SHA3-224/SHA3-256/SHA3-384/SHA3-512

16.哈希值算法特点

# 5. 消息认证码 -> HMAC

> 作用: 
>
> - 在通信的时候, 校验通信的数据有没有被篡改(完整性)
> - 没有加密的功能
>
> 使用:
>
> - 消息认证码的本质是一个散列值
> - `(原始数据 + 秘钥) * 哈希函数 = 消息认证码`
>   - 最关键的数据: 秘钥
>

17.常用哈希算法以及散列值长度

> 校验的过程:
>
> - 数据发送方A, 数据接收方B
> - 在A或B端生成一个秘钥: X, 进行分发 -> A和B端都有了 秘钥: X
> - 在A端进行散列值运算:  (原始数据 + x) * 哈希函数 = 得到散列值
> - 在A端: 将原始数据和散列值同时发送给B
> - 在B端:  -> AB端使用的哈希算法是相同的
>   - 接收数据
>   - 校验: (接收的原始数据 + x) * 哈希函数 = 散列值New
>   - 比较散列值: 散列值New 和 接收的散列值 是不是相同
>     - 相同: 没篡改
>     - 不同: 被修改了
>
> 缺点:
>
> - 秘钥分发困难
> - 不能区分消息的所有者

18.哈希值不可逆

> 作用:
>
> - 校验数据有没有被篡改(完整性)
> - 鉴别数据的所有者
> - 不能对数据加密
>
> 数字签名的过程:  -> 私钥加密数据
>
> - 生成一个非对称加密的密钥对, 分发公钥
> - 使用哈希函数对原始数据进行哈希运算 -> 散列值
> - 使用私钥对散列值加密 -> 密文
> - 将原始数据和密文一起发送给接收者

19.消息认证码

> 校验签名的过程:
>
> - 接收签名的一方分发的公钥
> - 接收签名者发送的数据:  `接收的原始数据 + 签名`  
> - 对数据进行判断:
>   - 对`接收的原始数据`进行哈希运算 -> 散列值new
>     - 和签名的时候使用的哈希函数相同(必须相同)
>   - 使用公钥对签名(密文) 解密 -> 得到了散列值old
>   - 比较两个散列值
>     - 相同: 数据的所有者确实是A, 并且数据没有被篡改
>     - 不同:  数据

20.数字签名和校验签名

> OpenSSL 是一个安全[套接字](https://baike.baidu.com/item/%E5%A5%97%E6%8E%A5%E5%AD%97)层密码库,囊括主要的[密码算法](https://baike.baidu.com/item/%E5%AF%86%E7%A0%81%E7%AE%97%E6%B3%95)、常用的[密钥](https://baike.baidu.com/item/%E5%AF%86%E9%92%A5)和证书封装管理功能及[SSL](https://baike.baidu.com/item/SSL)协议,并提供丰富的应用程序供测试或其它目的使用。 

21.openssl介绍

> [SSL](https://baike.baidu.com/item/SSL)是Secure Sockets Layer([安全套接层协议](https://baike.baidu.com/item/%E5%AE%89%E5%85%A8%E5%A5%97%E6%8E%A5%E5%B1%82%E5%8D%8F%E8%AE%AE))的缩写,可以在Internet上提供秘密性传输。[Netscape](https://baike.baidu.com/item/Netscape)公司在推出第一个[Web浏览器](https://baike.baidu.com/item/Web%E6%B5%8F%E8%A7%88%E5%99%A8)的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为[Internet](https://baike.baidu.com/item/Internet)上保密通讯的工业标准。 

22.openssl介绍

23.vs下opensl的配置

24.openssl在Linux的安装

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装vllm

ubuntu 22.04, RTX3080, cuda 12.1, cudnn 8.9.7&#xff0c;cuda和cudnn的安装参考&#xff1a;https://blog.csdn.net/m0_52111823/article/details/147154526?spm1001.2014.3001.5501。 查看版本对应关系&#xff0c;下载12.1对应的whl包&#xff0c;https://github.com/vl…

【WPF】自定义控件:ShellEditControl-同列单元格编辑支持文本框、下拉框和弹窗

需要实现表格同一列&#xff0c;单元格可以使用文本框直接输入编辑、下拉框选择和弹窗&#xff0c;文本框只能输入数字&#xff0c;弹窗中的数据是若干位的二进制值。 本文提供了两种实现单元格编辑状态下&#xff0c;不同编辑控件的方法&#xff1a; 1、DataTrigger控制控件的…

Gson、Fastjson 和 Jackson 对比解析

目录 1. Gson (Google) 基本介绍&#xff1a; 核心功能&#xff1a; 特点&#xff1a; 使用场景&#xff1a; 2. Fastjson (Alibaba) 基本介绍&#xff1a; 核心功能&#xff1a; 特点&#xff1a; 使用场景&#xff1a; 3. Jackson 基本介绍&#xff1a; 核心功能…

浅谈微信视频号推荐算法

这次可能会稍微有点干货&#xff0c;但保证不晦涩~ 一、算法推荐的本质&#xff1a;猜你喜欢 vs 社交绑架​ 视频号的推荐系统本质上在做两件事&#xff1a; ​预测你的兴趣​&#xff1a;通过你的浏览、点赞、评论、分享等行为&#xff0c;分析你的偏好。​满足社交需求​&…

halcon模板匹配(一)create_shape_model_xld

目录 一、提取刹车盘孔洞轮廓二、形状模板的创建-设置-训练-查找三、找到亮的圆孔四、获得匹配结果五、使用use_polarity进行模板匹配六、计算四个圆对应的矩形框七、创建四个圆对应的模板并查找一、提取刹车盘孔洞轮廓 小技巧总结,使用boundary 函数提取区域边界,在边界范围…

day26图像处理OpenCV

文章目录 一、OpenCV1.介绍2.下载3.图像的表示4.图像的基本操作4.1图片读取或创建4.1.1读取4.1.2创建 4.2创建窗口4.3显示图片4.3.1设置读取的图片4.3.2设置显示多久4.3.3释放 4.4.保存图片4.5图片切片&#xff08;剪裁&#xff09;4.6图片大小调节 5.在图像中绘值5.1绘制直线5…

零基础开始学习鸿蒙开发-智能家居APP离线版介绍

目录 1.我的小屋 2.查找设备 3.个人主页 前言 好久不发博文了&#xff0c;最近都忙于面试&#xff0c;忙于找工作&#xff0c;这段时间终于找到工作了。我对鸿蒙开发的激情依然没有减退&#xff0c;前几天做了一个鸿蒙的APP&#xff0c;现在给大家分享一下&#xff01; 具体…

C++的*了又*

先看下面一段代码 class HeapWord {friend class VMStructs;private:char *i; };主函数 #include "HeapWord.hpp" int main() {HeapWord *heapword new HeapWord();HeapWord *p new HeapWord();HeapWord **p1 new HeapWord *();heapword 3;*(HeapWord **)p he…

yolov8在windows系统的C++版本的onnxruntime部署方法

1.各个软件的的环境需要保持在统一的版本。 onnxruntime需要和cuda的版本对应上,版本号:onnxruntime-win-x64-gpu-1.18.1 ,链接: NVIDIA - CUDA | onnxruntime cuda:本机显卡支持的版本,cuda11.7,链接:CUDA Toolkit Archive | NVIDIA Developer cudnn:需要对应到cud…

js chrome 插件,下载微博视频

修改说明&#xff1a; 代码资源&#xff0c;免积分下载 起因&#xff0c; 目的: 最初是想下载微博上的NBA视频&#xff0c;因为在看网页上看视频很不方便&#xff0c;快进一次是10秒&#xff0c;而本地 VLC 播放器&#xff0c;快进一次是5秒。另外我还想做点视频剪辑。 对比…

【vue3】@click函数传动态变量参数

根据java的学习&#xff0c;摸索了一下vue3 函数传参的方式。以此作为记录。有更好的其它方式&#xff0c;可以评论区补充。 <script> const tmpref(); </script><button click"tmpFunction(传递参数:tmp)">按钮</button> // 直接【字符串…

jmeter 集成ZAP进行接口测试中的安全扫描 实现方案

以下是将 JMeter 集成 ZAP(OWASP Zed Attack Proxy)进行接口测试中安全扫描的实现方案: 1. 环境准备 JMeter 安装:从 JMeter 官方网站(https://jmeter.apache.org/download_jmeter.cgi)下载并安装 JMeter,确保其版本稳定。ZAP 安装:从 ZAP 官方网站(https://www.zapr…

全能格式转换器v16.3.0.159绿色便携版

前言 全能格式转换器具有音视频格式转换、合并视频、压缩视频、录制视频、下载视频、DVD刻录等功能。以超快的转换速度及强大的功能在国外名声大噪&#xff0c;转换速度是市面同类产品的30倍&#xff0c;操作简便&#xff0c;支持158种视频格式无损转换&#xff0c;批量转换高…

【基于开源insightface的人脸检测,人脸识别初步测试】

简介 InsightFace是一个基于深度学习的开源人脸识别项目,由蚂蚁金服的深度学习团队开发。该项目提供了人脸检测、人脸特征提取、人脸识别等功能,支持多种操作系统和深度学习框架。本文将详细介绍如何在Ubuntu系统上安装和实战InsightFace项目。 目前github有非常多的人脸识…

设计一个简单的权限管理系统

针对大规模服务器集群的权限管理系统设计&#xff0c;需结合 角色分层、最小权限原则 和 动态权限控制 来实现安全高效的权限管理。以下是分阶段设计方案&#xff1a; 一、核心设计思路 基于角色的访问控制&#xff08;RBAC&#xff09; 定义角色层级&#xff08;如董事长 >…

使用 nano 文本编辑器修改 ~/.bashrc 文件与一些快捷键

目录 使用 nano 编辑器保存并关闭文件使用 sed 命令直接修改文件验证更改 如果你正在使用 nano 文本编辑器来修改 ~/.bashrc 文件&#xff0c;以下是保存并关闭文件的具体步骤&#xff1a; 使用 nano 编辑器保存并关闭文件 打开 ~/.bashrc 文件 在终端中运行以下命令&#xf…

spm12_fMRI 2*4混合方差分析 Flexible factorial 对比矩阵

实验设计&#xff1a;2*4被试内设计 分析模型&#xff1a;spm 二阶分析中的 Flexible factorial 问题&#xff1a;Flexible factorial交互作用对比矩阵如何编写&#xff1f; 老师&#xff1a;deepseek老师【大神们看看这个矩阵是否可以如下编写&#xff1f;】 以下是来自de…

用Python修改字体字形与提取矢量数据:fontTools实战指南

字体设计与分析是NLP和视觉领域的交叉应用&#xff0c;而**fontTools** 是一款强大的Python库&#xff0c;可以让我们直接操作字体文件的底层结构。本文将通过两个实用函数&#xff0c;展示如何修改特定字形和提取所有字形的矢量数据&#xff0c;帮助开发者快速上手字体编辑与分…

Windows 11 PowerShell重定向文本文件的编码问题

目录 问题的由来 编码导致的问题 解决办法 VSCode进行转换 记事本进行转换 直接指定输出的文本编码 总结 问题的由来 在我的嵌入式系统的课程中有一个裸机开发的实验&#xff0c;其中需要把图片等文件转换为C语言数组保存在程序中。课程中&#xff0c;我推荐了CodePlea的…

SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用

SQL 是一种至关重要的数据库操作语言&#xff0c;尽管其语法与通用编程语言有所不同&#xff0c;但因其在众多应用中的广泛使用&#xff0c;大多数程序员都具备一定的 SQL 编写能力。然而&#xff0c;当面对复杂的 SQL 语句或优化需求时&#xff0c;往往需要专业数据库开发工程…