当前位置: 首页 > news >正文

计算机网络安全 —— 对称加密算法 DES (一)

一、对称加密算法概念#

​ 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换的人都不可理解的形式, 从而保证了数据的机密性。这种变换被称为加密( encryption),被加密的数据被称为密 文( ciphertext),而加密前的数据被称为明文( plaintext)。 接收方必须能通过某种逆变换将密文重新变换回原来的明文,该逆变换被称为解密( decryption)。加密和解密过程可以以一个密钥( key)为参数,并且加密和解密过程可以公开, 而只有密钥需要保密。 即只有知道密钥的人才能解密密文,而任何人,即使知道加密或解密算法也无法解密密文。

​ 加密密钥和解密密钥可以相同,也可以不同,取决于采用的是对称密钥密码体制还是公开密钥密码体制

​ 所谓对称密钥密码体制是一种加密密钥与解密密钥相同的密码体制。在这种加密系统中, 两个参与者共享同一个秘密密钥,如果用一个特定的密钥加密一条消息,也必须要使用相同的密钥来解密该消息。该系统又称为对称密钥系统。

​ 数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。其加密解密基本流程如下图:

img

二、.NET 使用 DES 加密#

​ DES使用的密钥为64 位( 实际密钥长度为56 位,有8位用于奇偶校验)。密码的字节长度不能低于64位(8个字节),下面是实现代码:

  1 using System;2 using System.IO;3 using System.Linq;4 using System.Security.Cryptography;5 using System.Text;6 7 namespace encryption.des8 {9     /// <summary>10     /// DES 加密与解密11     /// DES加密:https://www.zhihu.com/question/3676782912     /// 加密基本知识:https://www.biaodianfu.com/des.html13     /// </summary>14     public class DesAlgorithm15     {16         public Encoding Encoding { get; set; }17         public PaddingMode Padding { get; set; }18         public CipherMode Mode { get; set; }19         public string PassWord { get; private set; }20         private DESCryptoServiceProvider _des;21 22         #region .ctor23 24         public DesAlgorithm()25         {26             _des = new DESCryptoServiceProvider();27             PassWord = Convert.ToBase64String(_des.Key);28             Encoding = Encoding.UTF8;29             Padding = PaddingMode.PKCS7;30             Mode = CipherMode.CBC;31         }32         #endregion33 34 35         /// <summary>36         /// 通过字符串生成新的密钥37         /// </summary>38         /// <param name="password">密码</param>39         /// <returns></returns>40         public DESCryptoServiceProvider CreateNewkey(string password)41         {42             try43             {44                 byte[] buffer = Encoding.GetBytes(password).Skip(0).Take(8).ToArray();45                 _des = new DESCryptoServiceProvider()46                 {47                     Key = buffer,48                     IV=buffer,49                 };50                 PassWord = password;51                 return _des;52             }53             catch (Exception e)54             {55                Console.WriteLine($"Wrong Length:{e.Message},{e.InnerException}");56                return null;57             }58         }59 60         /// <summary>61         /// DES加密62         /// </summary>63         /// <param name="pToEncrypt">需要加密的字符串<see cref="string"/></param>64         /// <returns></returns>65         public string Encrypt(string pToEncrypt)66         {67             byte[] inputByteArray = Encoding.GetBytes(pToEncrypt);68             return Convert.ToBase64String(this.Encrypt(inputByteArray));69         }70 71         /// <summary>72         /// DES加密73         /// </summary>74         /// <param name="pToEncrypt">待加密的byte数组<see cref="byte"/></param>75         /// <returns></returns>76         public byte[] Encrypt(byte[] pToEncrypt)77         {78             byte[] base64 = null;79             using (var ms = new MemoryStream())80             {81                 using (var cs = new CryptoStream(ms, _des.CreateEncryptor(), CryptoStreamMode.Write))82                 {83                     cs.Write(pToEncrypt, 0, pToEncrypt.Length);84                     cs.FlushFinalBlock();85                 }86                 base64 = ms.ToArray();87             }88             return base64;89         }90 91         /// <summary>92         /// DES解密93         /// </summary>94         /// <param name="pToDecrypt">需要解密的字符串</param>95         /// <returns></returns>96         public  string Decrypt(string pToDecrypt)97         {98             byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);99             return Encoding.GetString(this.Decrypt(inputByteArray));
100         }
101 
102         /// <summary>
103         /// DES解密
104         /// </summary>
105         /// <param name="pToDecrypt">待解密的byte数组<see cref="byte"/></param>
106         /// <returns></returns>
107         public byte[] Decrypt(byte[] pToDecrypt)
108         {
109             byte[] data = null;
110             using (var ms = new MemoryStream())
111             {
112                 using (CryptoStream cs = new CryptoStream(ms, _des.CreateDecryptor(), CryptoStreamMode.Write))
113                 {
114                     cs.Write(pToDecrypt, 0, pToDecrypt.Length);
115                     cs.FlushFinalBlock();
116                 }
117                 data = ms.ToArray();
118             }
119             return data;
120         }
121     }
122 }

三、.NET 使用 3DES 加密#

​ DES使用的密钥为64 位,它是一个优秀的密码算法,目前还没有发现比蛮力攻击更好的破解方法。但随着计算机运算速度的快速提高,56位长的密钥已显得太短。56位长的密钥意味着共有256种可能的密钥,也就是说,共约有7. 6 × 1016 种密钥。假设一台计算机1 µ s可执行一次DES加密,同时假定平均只需搜索密钥空间的一半即可找到密钥,那么破译DES要超过1千年。但现在利用并行计算技术已经设计出搜索DES密钥的专用芯片。例如,在1999年有一批在因特网上合作的人借助于一台不到25万美元的专用计算机,在略大于22h的时间就破译了56 位密钥的DES。

​ 为解决DES密钥太短的问题,人们提出了三重DES(Triple DES, 3DES),并在1985年成为美国的一个商用加密标准[ RFC 2420]。3DES在加密时,用三个密钥,执行三次DES算法: 即 E运算 → D运算 → E运算。 解密时,按相反顺序使用这三个密钥,执行D运算 → E运算 → D运算。

​ 3DES目前正在被2001年发布的高级加密标准( Advanced Encryption Standard, AES)所替代。AES能够使用128位、192位和256位长的密钥,用硬件和软件都可以快速实现。它不需要太多内存,因此适用于小型移动设备。美国国家标准与技术研究所NIST估计,如果用1s破解56位DES的计算机来破解一个128位的AES密钥的话,要用大约149万亿年的时间才有可能。

img

​ 3DES 使用现有的DES算法,并且当三个密钥相同时,效果就和DES一样。这有利于逐步推广使用3DES。也可以仅使用两个密钥,即 K1= K3,相当于密钥长度112位,这对于多数商业应用也已经足够长了。下面代码我们采用密钥长度56*3=168位的3EDS算法:

  1 using System;2 using System.IO;3 using System.Linq;4 using System.Security.Cryptography;5 using System.Text;6 7 namespace encryption.des8 {9     /// <summary>10     /// 3DES加密与解密11     /// </summary>12     public class TripleDesAlgorithm13     {14         public Encoding Encoding { get; set; }15         public PaddingMode Padding { get; set; }16         public CipherMode Mode { get; set; }17         public string PassWord { get; private set; }18 19         private TripleDESCng _des;20 21         #region .ctor22 23         public TripleDesAlgorithm()24         {25             _des = new TripleDESCng();26             PassWord = Convert.ToBase64String(_des.Key);27             Encoding = Encoding.UTF8;28             Padding = PaddingMode.PKCS7;29             Mode = CipherMode.CBC;30         }31         #endregion32 33         /// <summary>34         /// 通过字符串生成新的密钥35         /// </summary>36         /// <param name="password">密码</param>37         /// <returns></returns>38         public TripleDESCng CreateNewkey(string password)39         {40             try41             {42                 byte[] key = Encoding.GetBytes(password).Skip(0).Take(24).ToArray();43                 byte[] iv = Encoding.GetBytes(password).Skip(0).Take(8).ToArray();44                 _des = new TripleDESCng()45                 {46                     Key = key,47                     IV = iv,48                 };49                 PassWord = password;50                 return _des;51             }52             catch (Exception e)53             {54                 Console.WriteLine($"Wrong Length:{e.Message},{e.InnerException}");55                 return null;56             }57         }58 59         /// <summary>60         /// 3DES加密61         /// </summary>62         /// <param name="pToEncrypt">需要加密的字符串<see cref="string"/></param>63         /// <returns></returns>64         public string Encrypt(string pToEncrypt)65         {66             byte[] inputByteArray = Encoding.GetBytes(pToEncrypt);67             return Convert.ToBase64String(this.Encrypt(inputByteArray));68         }69 70         /// <summary>71         /// 3DES加密72         /// </summary>73         /// <param name="pToEncrypt">需要加密的byte数组<see cref="byte"/></param>74         /// <returns></returns>75         public byte[] Encrypt(byte[] pToEncrypt)76         {77             byte[] base64 = null;78             using (var ms = new MemoryStream())79             {80                 using (var cs = new CryptoStream(ms, _des.CreateEncryptor(), CryptoStreamMode.Write))81                 {82                     cs.Write(pToEncrypt, 0, pToEncrypt.Length);83                     cs.FlushFinalBlock();84                 }85                 base64 = ms.ToArray();86             }87             return base64;88         }89 90         /// <summary>91         /// 3DES解密92         /// </summary>93         /// <param name="pToDecrypt">需要解密的字符串<see cref="string"/></param>94         /// <returns></returns>95         public string Decrypt(string pToDecrypt)96         {97             byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);98             return Encoding.GetString(this.Decrypt(inputByteArray));99         }
100 
101         /// <summary>
102         /// 3DES解密
103         /// </summary>
104         /// <param name="pToDecrypt">需要解密的byte数组<see cref="byte"/></param>
105         /// <returns></returns>
106         public byte[] Decrypt(byte[] pToDecrypt)
107         {
108             byte[] data = null;
109             using (var ms = new MemoryStream())
110             {
111                 using (CryptoStream cs = new CryptoStream(ms, _des.CreateDecryptor(), CryptoStreamMode.Write))
112                 {
113                     cs.Write(pToDecrypt, 0, pToDecrypt.Length);
114                     cs.FlushFinalBlock();
115                 }
116                 data = (ms.ToArray());
117             }
118             return data;
119         }
120     }
121 }

四、测试代码与效果#

 1         static void Main(string[] args)2         {3             // DES字符串加密与解密4             {5                 Console.WriteLine("-----------------------------------------------------DES字符串加密与解密--------------------------------------------------");6                 var input = "数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。";7                 Console.Write($"加密内容:\r\n{input}\r\n");8                 var des = new DesAlgorithm();9                 // TEST:可使用该方法通过字符串生成新的密钥
10                 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
11                 Console.WriteLine($"DES密钥:\r\n{des.PassWord}\r\n");
12                 var encrypt = des.Encrypt(input);
13                 Console.WriteLine($"DES加密后内容:\r\n{encrypt}\r\n");
14                 var decrypt = des.Decrypt(encrypt);
15                 Console.WriteLine($"DES解密后内容:\r\n{decrypt}\r\n");
16             }
17 
18             // DES文件加密与解密
19             {
20                 Console.WriteLine("---------------------------------------------------DES文件加密与解密--------------------------------------------------");
21                 var input = System.IO.File.ReadAllBytes(@"C:\Users\97460\Desktop\1.rar");
22                 Console.Write($"加密内容:\r\n{Convert.ToBase64String(input)}\r\n");
23                 var des = new DesAlgorithm();
24                 // TEST:可使用该方法通过字符串生成新的密钥
25                 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
26                 Console.WriteLine($"DES密钥:\r\n{des.PassWord}\r\n");
27                 var encrypt = des.Encrypt(input);
28                 Console.WriteLine($"DES加密后内容:\r\n{Convert.ToBase64String(encrypt)}\r\n");
29                 var decrypt = des.Decrypt(encrypt);
30                 Console.WriteLine($"DES解密后内容:\r\n{Convert.ToBase64String(decrypt)}\r\n");
31                 System.IO.File.WriteAllBytes("1.rar", decrypt);
32             }
33 
34 
35 
36             // 3DES字符串加密与解密
37             {
38                 Console.WriteLine("---------------------------------------------------3DES字符串加密与解密--------------------------------------------------");
39                 var input = "数据加密标准( Data Encryption Standard, DES)是对称密钥密码的典型代表,由IBM公司研制,于1977年被美国定为联邦信息标准 。";
40                 Console.Write($"加密内容:\r\n{input}\r\n");
41                 var des = new TripleDesAlgorithm();
42                 // TEST:可使用该方法通过字符串生成新的密钥
43                 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
44                 Console.WriteLine($"3DES密钥:\r\n{des.PassWord}\r\n");
45                 var encrypt = des.Encrypt(input);
46                 Console.WriteLine($"3DES加密后内容:\r\n{encrypt}\r\n");
47                 var decrypt = des.Decrypt(encrypt);
48                 Console.WriteLine($"DES解密后内容:\r\n{decrypt}\r\n");
49             }
50 
51             // 3DES文件加密与解密
52             {
53                 Console.WriteLine("---------------------------------------------------3DES文件加密与解密--------------------------------------------------");
54                 var input = System.IO.File.ReadAllBytes(@"C:\Users\97460\Desktop\1.rar");
55                 Console.Write($"加密内容:\r\n{Convert.ToBase64String(input)}\r\n");
56                 var des = new TripleDesAlgorithm();
57                 // TEST:可使用该方法通过字符串生成新的密钥
58                 //des.CreateNewkey("https://www.cnblogs.com/dongweian");
59                 Console.WriteLine($"3DES密钥:\r\n{des.PassWord}\r\n");
60                 var encrypt = des.Encrypt(input);
61                 Console.WriteLine($"3DES加密后内容:\r\n{Convert.ToBase64String(encrypt)}\r\n");
62                 var decrypt = des.Decrypt(encrypt);
63                 Console.WriteLine($"3DES解密后内容:\r\n{Convert.ToBase64String(decrypt)}\r\n");
64                 System.IO.File.WriteAllBytes("1.rar", decrypt);
65             }
66             Console.ReadKey();
67         }

img

相关内容:计算机网络安全 —— 非对称加密算法 RSA 和数字签名(二)、计算机网络安全 —— 报文摘要算法 ME5 (三)、计算机网络安全 —— 实体鉴别与生成大随机数(四)

相关文章:

计算机网络安全 —— 对称加密算法 DES (一)

一、对称加密算法概念# ​ 我们通过计算机网络传输数据时&#xff0c;如果无法防止他人窃听&#xff0c; 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换的人都不可理解的形式&#xff0c; 从而保证了数据的机密性。这种变换被称为加密&#xff08; encryptio…...

5. ARM_指令集

概述 分类 汇编中的符号&#xff1a; 指令&#xff1a;能够编译生成一条32位机器码&#xff0c;并且能被处理器识别和执行伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条指令伪操作&#xff1a;不会生成指令&#xff0c;只是在编译阶段告诉编译器怎…...

Jenkins的pipeline Script的 每个组件的详细讲解

在Jenkins的Pipeline脚本中&#xff0c;各个组件的配置和Groovy的一些常用函数起到了决定性的作用&#xff0c;帮助开发人员控制自动化流程的执行。以下是对Jenkins Pipeline的主要组件和Groovy常用函数的详细讲解&#xff1a; 1. Jenkins Pipeline主要组件 1.1 agent 功能&…...

Tomcat 和 Netty 的区别及应用场景分析

在 Java Web 开发中&#xff0c;Tomcat 和 Netty 都是常见的网络框架&#xff0c;它们各自有着不同的设计理念和适用场景。本文将通过详细的对比和实际场景示例&#xff0c;帮助你理解 Tomcat 和 Netty 在功能、性能、架构等方面的差异&#xff0c;帮助你在实际开发中做出更合理…...

6.C操作符详解,深入探索操作符与字符串处理

C操作符详解&#xff0c;深入探索操作符与字符串处理 C语言往期系列文章目录 往期回顾&#xff1a; C语言是什么&#xff1f;编程界的‘常青树’&#xff0c;它的辉煌你不可不知VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础…...

生数科技发布 Vidu 1.5 新版本,引领视频大模型新潮流

在国内视频大模型领域&#xff0c;生数科技一直以创新和突破而备受瞩目。近日&#xff0c;生数科技再度发力&#xff0c;发布了 Vidu 1.5 新版本&#xff0c;为视频创作带来了全新的变革与机遇。 Vidu 1.5 新版本在多个方面展现出了卓越的性能和创新的特点。首先&#xff0c;它…...

CentOS 7 aarch64停止更新后安装gcc8 —— 筑梦之路

CentOS 7.9非X86架构系统生命周期结束后&#xff08;2024-6-30&#xff09;配置在线可用yum源 —— 筑梦之路_centos7.9 arm-CSDN博客 以前的做法 sudo yum install centos-release-scl-rh sudo yum install devtoolset-8-buildsudo yum install devtoolset-8-gdb sudo yum i…...

WPF下 DataGrid加入序号列

先上代码&#xff1a; <DataGrid Name"DGV" AutoGenerateColumns"False" Grid.Row"0" Grid.Column"0" HorizontalGridLinesBrush"RoyalBlue" VerticalGridLinesBrush"Tomato" CanUserAddRows"False&qu…...

iOS UI 自动化 手势右滑退出当前页面

1、TouchAction from appium.webdriver.common.touch_action import TouchAction# 获取屏幕的宽度和高度 screen_width driver.get_window_size()["width"] screen_height driver.get_window_size()["height"]# 定义滑动的起点和终点坐标 start_x 0 en…...

《MySQL 实战教程:从零开始到高手进阶》

当然可以。下面是一篇关于MySQL的学习指南&#xff0c;它适合初学者到中级用户&#xff0c;涵盖了MySQL的基础知识、安装步骤、基本命令以及一些高级功能。 MySQL 学习指南 1. 了解 MySQL MySQL 是一个关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典…...

第27天 安全开发-PHP应用TP 框架路由访问对象操作内置过滤绕过核心漏洞

时间轴 演示案例 TP 框架-开发-配置架构&路由&MVC 模型 TP 框架-安全-不安全写法&版本过滤绕过 TP 框架-开发-配置架构&路由&MVC 模型 参考&#xff1a; https://www.kancloud.cn/manual/thinkphp5_1 1、配置架构-导入使用 去thinkphp官网可以看到&…...

应用系统开发(12) Zync中实现数字相敏检波

在 Xilinx Zynq 系列(如 Zynq-7000 或 Zynq UltraScale+)中实现数字相敏检波(DSP,Digital Synchronous Detection)可以通过硬件(PL部分,FPGA逻辑)和软件(PS部分,ARM Cortex-A 处理器)的协同工作来实现。以下是一个详细的设计方法,包括基本原理和 Zynq 的实现步骤。…...

栈Stack和队列Queue

目录 一、栈 &#xff08;1&#xff09;用数组实现 &#xff08;2&#xff09;用单链表实现 &#xff08;3&#xff09;用标注尾结点的单链表实现 &#xff08;4&#xff09;用双向链表实现 2、栈的实际应用 &#xff08;1&#xff09;改变元素的序列 &#xff08;2&am…...

uniapp 微信小程序地图标记点、聚合点/根据缩放重合点,根据缩放登记显示气泡marik标点

如图&#xff0c;如果要实现上方的效果&#xff1a; 上方两个效果根据经纬度标记点缩放后有重复点会添加数量 用到的文档地址https://developers.weixin.qq.com/miniprogram/dev/api/media/map/MapContext.addMarkers.htmlMapContext.addMarkers(Object object) 添加标记点Ma…...

Percona XtraBackup备份docker版本mysql 5.7

my.cnf配置文件 [client] default_character_setutf8[mysqld] # 数据存储目录&#xff08;必须手动指定&#xff09; datadir/var/lib/mysql/data# 字符集 collation_server utf8_general_ci character_set_server utf8 # 二进制日志 server-id1 log_bin/var/log/mysql/binl…...

C++:关联式容器的介绍及map与set的使用

我们之前已经学习过string,vector,list,queue,priority_queue等容器&#xff0c;这些容器我们统称为序列式容器&#xff0c;因为它们的数据的逻辑结构呈线性。因为这些容器中存储的数据即便二者之间发生交换&#xff0c;也不会对原有的容器结构造成太大影响。 但上篇文章我们介…...

一文说清:Linux下C++静态库的封装和调用

一 引言 《一文说清&#xff1a;windows下C静态库的封装和调用》中说了&#xff1a; 静态库允许开发者在多个项目中复用代码&#xff0c;减少重复劳动&#xff0c;并增强程序的可维护性。并讲述了windows环境下创建、封装以及调用C静态库的过程。 本文则描述了&#xff0c;如…...

【Java 学习】数据类型、变量、运算符、条件控制语句

Java基础语法 1. 打印 Hello World !2. 变量类和数据类型2.1 什么是变量&#xff1f;什么是数据类型&#xff1f;2.2 常用的数据类型2.3 使用变量2.4 String 类数据类型2.4.1 String 类基本概念2.4.2 String 类的使用 3. 运算符3.1 算数运算符3.2 关系运算符3.3 逻辑运算符3.4 …...

【软考】系统架构设计师-数据库设计基础

数据库核心考点 三级模式-两级映射 外模式--视图 概念模式--表&#xff08;模式、基本表&#xff09; 内模式--物理文件 数据库设计 概念结构设计&#xff1a;属性冲突、命名冲突、结构冲突 逻辑结构设计&#xff1a;关系模式&#xff08;层次模型、网络模型&#xff09…...

【Jmeter相关】

Jmeter 可以作为接口测试问题&#xff0c;也会涉及到性能相关的问题 一、JMeter中用户定义的变量(User Defined Variables&#xff09;和用户参 数&#xff08;User Parameters&#xff09;的区别是什么? 在JMeter中都是用于定义和存储测试数据的方法&#xff0c;但它们有一…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...