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

密码学--希尔密码

一、实验目的

 1、通过实现简单的古典密码算法,理解密码学的相关概念

  2、理解明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。

二、实验内容

1、题目内容描述

①定义分组字符长度

随机生成加密密钥并验证密钥的可行性

plain文件读入待加密明文

④判断明文长度是否需要填充

进行希尔密码加密

⑥将加密后得到的密文放入cipher文件

根据加密密钥计算解密密钥

进行解密运算

⑨将解密后的文本放入plain_decrypted文件,与明文进行对比

⑩仿射密码与希尔密码的异同

  1. 关键代码的设计、实现与执行

设计思路:

在最开始以宏定义的方式定义分组字符长度,关键代码:
#define M 2 //定义最大分组长度

先以时间产生随机数作为加密密钥矩阵enkey,但是这里要通过求最大公因数的方式来验证加密密钥enkey的可行性,即密钥矩阵enkey的行列式detb和N的最大公因数为1,即detb,N互质(其中N为定义在Zn上的N):

下面代码是运用Euclid算法计算最大公因数的关键代码:

srand(time(NULL));//以时间取随机数

do {

for (int i = 0; i < M; i++) {

for (int j = 0; j < M; j++) {

enkey[i][j] = rand() % N;//随机生成密钥矩阵

}

}

detb = enkey[0][0] * enkey[1][1] - enkey[0][1] * enkey[1][0];//计算加密矩阵的行列式

} while (gcd(detb, N) != 1);//检验密钥的可行性,也就是行列式与N是否互质,能否得到行列式的逆元

得到加密密钥后,从文件读入已经准备好的加密明文也可通过记事本修改),下面代码是以读的方式打开文件,并判断是否在文件夹中存在命名的文件的关键代码部分:

 FILE *plain_file = fopen("plain.txt", "r");//以读的方式打开

    if (plain_file == NULL) {

        printf("无法打开明文文件!\n");//判断无法打开给出提示

        exit(1);//无法打开只能以异常终止结束运行

}

得到明文后,先调用read_palinfile()函数,统计其长度,看是或否刚好为M的倍数,若不是就进行填充,此处对于剩余需要填充的部分都填的x,再重新计算需要加密解密的文本长度,于是有msize = msize + M - r,关键代码部分如下:

int msize = read_plainfile(plain_file, &plain_text[0]);

int r = msize % M;//判断是否需要填充

if (r < 0)

r += M;

if (r > 0)//如需填充,都填为0,加密后统一得到x

{

for (int i = msize; i < msize + M - r; i++)

plain_text[i] = 23;//x的ASCII码为120,'a'-'x'=120-97=23

msize = msize + M - r;//重新得到加密或解密文本新的长度

}

在得到明文文件后,调用函数read_plainflie(),将明文文件里的有效内容(即字母)放入字符数组,方便后续分组,且可以有效字符的长度,关键代码部分如下:

while ((ch = getc(plain_file)) != EOF)//getc()用于在打开文件中获取一个字符

{

if (ch >= 'a' && ch <= 'z')

*plain = ch - 97;//ASCII码转换

else if (ch >= 'A' && ch <= 'Z')

*plain = ch - 65;//ASCII码转换

else continue;

i++;//计数有效字符数量

*plain++;//指针加加,字符数组向下移一位,好存放下一次的字符

}

return i;//返回文件中有效字符的数量,以方便后续分组

以M为分组数量单位,进行加密,其中运用了二阶矩阵的运算,并判断得到的新的是否有负数,如有,加模,使其转化为正数,再加上a的ASCII码,使其统一为大写字母,*cipher++,指向下一次计算得到的字符存放的地址,关键代码部分如下:

for (i = 0; i < M; i++)//矩阵乘法

{

tmp = 0;

for (j = 0; j < M; j++)

tmp = tmp + plain[j] * enkey[j][i];// 分组加密计算

tmp %= N;//模N

if (tmp < 0)

tmp += N;//负数转正数

*cipher = tmp + 97;//统一转换为大写字母

*cipher++;

将字符数组分组,并调用分组加密的函数进行加密。tmpplain,tmpcipher是以M为单位长度的字符数组,将需要加密的文本分组放入tmpplain,再调用encrypt_block进行以M为单位长度的分组加密,得到的结果返回给同样是长度为M的tmpcipher字符数组,再依此传给cipher,关键代码部分如下:

for (i = 0; i < msize; i = i + M)//依此从字符数组中取M个字符,调用分组函数encrypt_block()进行加密或解密

{

for (j = 0; j < M; j++)

tmpplain[j] = plain[i + j];//在要加密或者解密的文件中连续截取M个字符放入存放M个字符的数组进行加密或解密

encrypt_block(tmpplain, enkey, &tmpcipher[0]);//调用分组加密函数

for (j = 0; j < M; j++)//将加密或者解密后得到的字母依次放入cipher数组

{

*cipher = tmpcipher[j];//赋值

*cipher++;//指针后移,下依此循环存放新的字幕

}

}

计算解密矩阵,由于计算矩阵的逆矩阵,是行列式的倒数(也就是此处的逆元)*伴随矩阵,二阶矩阵的伴随矩阵直接用口诀主对调,副变号即可,过程即是先调用inverse_a()计算行列式逆元,并判断其是否为负数,如是,加上N,使其转化成正数,再通过公式计算出解密矩阵,并判断矩阵中每个数是否为负数,如是,加上N使其转化成正数,得到解密所需的解密矩阵,以下是关键代码部分:

int a1 = inverse_a(detb);//计算加密矩阵行列式的逆元

if (a1 < 0)

a1 += N;

dekey[0][0] = enkey[1][1] * a1 % N;//主对调,副变号

dekey[0][1] = (-enkey[0][1] * a1) % N;

dekey[1][0] = (-enkey[1][0] * a1) % N;

dekey[1][1] = enkey[0][0] * a1 % N;

for (int i = 0; i < M; i++)//遍历检查解密矩阵中是否有负数,如有,加N,转换成正数

{

for (int j = 0; j < M; j++)

{

if (dekey[i][j] < 0)

dekey[i][j] += N;//加N

}

}

结果截图如下:

3、实验结果分析

多测几组后实验得到结果下:

由以上结果即分析可知加密的时候程序自动跳过了空格即字符进行了加密解密,且最后全部由小写字母输出,当然也可全部由大写字母输出,只需要将+97换成+65即可,因为分别对应着小写字母‘a’的ASCII码和大写字母‘A’的ASCII码

而在第二个实验的结果和第三个实验的结果发现多出了x,这是因为在以2分组时,会有剩余,于是由x进行了填充。

对于仿射密码和希尔密码的异同:
综上可知,希尔密码和仿射密码都是需要求逆元,只是仿射密码是直接对密钥求逆元得到的就是解密的密钥,而希尔是对加密矩阵的行列式求逆元,得到的也只是行列式的逆元,而还需要*加密矩阵的伴随矩阵,得到的新的矩阵才是解密的矩阵

在代码中也可以看到,希尔密码和仿射密码一样解密和加密几乎一样只是密钥矩阵不一样,步骤一样,所以可以直接调用一个函数,只是传参不一样。

不同的是,仿射密码是直接对明文的每个字符进行依此进行加密解密,而希尔密码需要对对需要加密或者解密问文本进行分组,每M个一组一起进行加密或者解密,如是在n个M组以后还有剩余不够M个,即进行填充,可以以任何形式进行填充,在此次实验中,我选择了小写字母x,因为在一般情况下,其出现频率最小。

三、实验思考

1、实验过程总结

在此次实验中,直接在仿射密码的代码上进行修改,就简单很多,只需要将不同的地方进行修改即可,如最大公因式函数、求逆元函数、以及文件打开等部分都保持不变,但在随机生成函数部分,由一个改成一个矩阵,然后就是分组进行加密解密部分进行修改。

但是在代码实现过程中由于编程能力问题,传参部分一直出现问题,最终经过查询相关知识得以解决,此外,在解密过程中,一开始没有调用read_plainfile()函数,读cipher文件里的东西直接进行解密,导致解密出来的的文本与明文一直不匹配,经过不断看看,分析代码,发现问题进行修改后解密出来的文本终于能够和原明文匹配。

通过此次实验使我加深了对希尔密码的理解,清晰了希尔密码加密解密每一步的原理,也知道了希尔密码和仿射密码的区别和相同点,同时加强了我自己的代码能力。

  1. 回答实验指导书最后提出的问题

对合密钥是一种弱密钥,不应该在实际加密中使用,这是为什么?

对合密钥使用了相同的密钥进行加密解密,这意味着加密和解密在同一个用户之间进行,这使得对合密钥的安全性受到很大的限制,因为如果一个用户失去了对合密钥的控制,他也将无法保护自己的信息;而如果两个用户使用同一个对合密钥进行加密和解密操作,那么他们的信息很容易被第三方窃取。这是因为他们涉及一个公共密钥,这意味着第三方也可以用这个公共密钥进行通信,从而获得敏感信息。

②若仿射密码定义在Z26上,其对合密钥有多少个?

仿射密码的加密函数为E(x) = (ax + b) mod 26,解密函数为D(x) = a^-1(x - b) mod 26,其中a和b为密钥,a^-1为a的模26乘法逆元。

由于对合函数要求f(f(x))=x,即E(E(x))=x,则有(E(E(x))) mod 26 = x,即((a(ax + b) + b) mod 26) mod 26 = x。解方程得到a^2x + ab + b = x,整理得到(a^2 - 1)x = (1 - ab) mod 26。

因为a^2 - 1必须是26的乘法逆元,所以a^2 - 1的因子必须是26的因子,即a^2 - 1必须是2或13的倍数,即a^2与26互质。根据这个条件,可以求出满足条件的a的取值,而对b没有什么限制,最后计算出满足条件的对合密钥的数量,代码计算结果如下:

若2×2的希尔密码定义在Z26上,其对合密钥有多少个?

希尔密码的加密函数为E(x) = Kx mod 26,其中K为2×2的密钥矩阵,解密函数为D(x) = K^-1x mod 26,其中K^-1为K的模26乘法逆元的矩阵。

对合函数要求f(f(x))=x,即E(E(x))=x,则有(E(E(x))) mod 26 = x,即((KKx) mod 26) mod 26 = x。解方程得到(KKx) mod 26 = x,即K*K是26n的单位矩阵[1,0;0,1]。根据这个条件,可以求出满足条件的2×2的对合密钥的数量。

以上是对合密钥数量的计算过程及代码运行结果。

相关文章:

密码学--希尔密码

一、实验目的 1、通过实现简单的古典密码算法&#xff0c;理解密码学的相关概念 2、理解明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。 二、实验内容 1、题目内容描述 ①定义分组字符长度 ②随机生成加密密钥&#xff0c;并验证密钥的可行性 …...

配置Hadoop集群-集群配置

以下是 Hadoop 集群的核心配置步骤&#xff0c;基于之前的免密登录和文件同步基础&#xff0c;完成 Hadoop 分布式环境的搭建&#xff1a; 1. 集群规划 假设集群包含 3 个节点&#xff1a; master&#xff1a;NameNode、ResourceManagerslave1&#xff1a;DataNode、NodeMana…...

第三方软件测评中心分享:软件功能测试类型和测试工具

在数字化时代&#xff0c;软件测试已成为确保产品质量的重要环节。功能测试作为软件测试中的核心部分&#xff0c;关注于软件产品是否按预期功能正常运作。 软件功能测试可以按不同的方式进行分类&#xff0c;主要包括以下几种类型&#xff1a;   1.正功能测试&#xff1a;验…...

Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互

Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互 Profibus DP主站转Modbus RTU/TCP&#xff08;XD-MDPBm20&#xff09;网关在Profibus总线侧实现主站功能&#xff0c;在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备&#xff08;如&#xff1a;海…...

多视角系统,视角之间的切换,输入操作。无人机Pawn视角的实现

一.创建自己的PlayerController。它相当于是灵魂&#xff0c;穿梭在不同Pawn之间。也即是切换视角。不同输入的响应也写在这里。这样即使&#xff0c;都有鼠标操作&#xff0c;也能区分。避免了代码的重复耦合。也可以叫做视角系统。 class LZJGAMEMODE_API ALZJPlayerControl…...

[学习]RTKLib详解:ionex.c、options.c与preceph.c

RTKLib详解&#xff1a;ionex.c、options.c与preceph.c 本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详解&…...

【Linux笔记】——进程信号的保存

&#x1f525;个人主页&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收录专栏&#x1f308;&#xff1a;Linux &#x1f339;往期回顾&#x1f339;&#xff1a;【Linux笔记】——进程信号的产生 &#x1f516;流水不争&#xff0c;争的是滔滔不 一、信号的相关概念二、信…...

教育机构教务管理系统哪个好?

在当今教育培训行业快速发展的背景下&#xff0c;一个高效、专业的教务管理系统已成为教育机构提升运营效率、优化教学质量的关键工具。本文将深入分析爱耕云教务管理系统的核心优势&#xff0c;通过具体功能解析和代码示例展示其技术实现方式&#xff0c;并对比市场上其他主流…...

ZYNQ笔记(二十):Clocking Wizard 动态配置

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;ZYNQ PS端 通过 AXI4Lite 接口配置 Clocking Wizard IP核输出时钟频率 目录 一、介绍 二、寄存器定义 三、配置 四、PS端代码 一、介绍 Xilinx 的 Clock Wizard IP核 用于在 FPGA 中生成和管理…...

电商平台一站式网络安全架构设计指南

摘要&#xff1a;据 Gartner 统计&#xff0c;采用一体化安全方案的电商企业数据泄露成本降低 67%。本文从攻击链分析到防御体系构建&#xff0c;详解如何实现网络层、应用层、数据层的协同防护。 一、电商安全威胁全景图&#xff08;2024 攻击态势&#xff09; 1.1 攻击者完…...

烟花爆竹储存需要注意哪些问题

烟花爆竹储存需要注意哪些问题 烟花爆竹作为易燃易爆物品&#xff0c;其储存安全至关重要。不当的储存方式不仅可能导致产品失效&#xff0c;更可能引发火灾、爆炸等严重事故。以下是烟花爆竹储存需要注意的几个关键问题&#xff1a; 一、储存场所选择 必须选择专用仓库储存…...

C++11详解

文章目录 前言一、列表初始化1.1 {} 初始化1.2 initializer_list 类型 三、声明3.1 auto3.2 decltype 四、右值引用和移动语义4.1 左值引用和右值引用4.2 移动语义 五、可变参数模板六、lambda表达式各部分详细解释示例代码代码解释 七、包装器八、bind注意事项 前言 C11在系统…...

VLM-RL:用于安全自动驾驶的统一视觉语言模型和强化学习框架——论文阅读

《VLM-RL: A Unified Vision Language Models and Reinforcement Learning Framework for Safe Autonomous Driving》2024年12月发表&#xff0c;来自Wisconsin Madison分校和Purdue大学的论文。 近年来&#xff0c;基于强化学习&#xff08;RL&#xff09;的学习驾驶策略的方法…...

新手安装java所有工具(jdk、idea,Maven,数据库)

新手安装JAVA工具 介绍JDK11IDEA 2025.1Maven数据库&#xff08;Navicat Premium Lite&#xff09; 介绍 涉及安装JAVA所需的各种工具 JDK&#xff08;以JDK11为例&#xff09;IDEA&#xff08;以2025.1为例&#xff09;Maven&#xff08;以3.8.8为例&#xff09;数据库&…...

hive在配置文件中添加了hive.metastore.uris之后进入hive输入命令报错

在hive-site.xml文件中加入配置hive.metastore.uris启动hive后报错 <property><name>hive.metastore.uris</name><value>thrift://node154:9083</value></property> 加完属性就需要手动启动metastore服务&#xff0c;因为不使用 Zookeepe…...

Hive原理

Hive 是构建在 Hadoop 上的数据仓库工具,其核心原理是通过类 SQL 语言(HiveQL)将结构化数据查询转换为分布式计算任务(如 MapReduce、Tez、Spark),并利用 HDFS 存储数据。以下是 Hive 的核心原理和架构: 1. 核心设计思想‌ ‌数据仓库抽象‌:将 HDFS 上的文件抽象为‌…...

cursor 出现 unauthorized request

文档出自&#xff1a;https://www.kdocs.cn/l/csE3iuSauHoS...

uniapp|商品列表加入购物车实现抛物线动画效果、上下左右抛入、多端兼容(H5、APP、微信小程序)

以uniapp框架为基础,详细解析商品列表加入购物车抛物线动画的实现方案。通过动态获取商品点击位置与购物车坐标,结合CSS过渡动画模拟抛物线轨迹,实现从商品图到购物车图标的动态效果。 目录 核心实现原理坐标动态计算抛物线轨迹模拟​动画元素控制代码实现详解模板层设计脚本…...

点下4个Winform UI开源控件库

从零学习构建一个完整的系统 今天一起来盘点下4个Winform UI开源控件库&#xff0c;有.Net Framework&#xff0c;也有.Net Core。 1、支持.Net 7的开源UI组件框架 项目简介 这是一个基于.Net Framework、.Net 6开发的&#xff0c;WinForm开源UI框架&#xff0c;框架包含常…...

【AI】mcp server本质就是一个接口服务么

以下为元宝的回答&#xff1a; 你的理解非常准确&#xff01;​​MCP Server​​本质上是一个接口服务&#xff0c;但其设计目标、交互逻辑和使用场景与传统后端接口存在显著差异。以下是两者的对比分析&#xff1a; ​​1. 核心定位差异​​ ​​维度​​​​MCP Server​​…...

chalrs正常使用一段时间后开启代理访问网页 显示“不是私密链接”解决办法

chalrs正常使用一段时间后开启代理访问网页 显示“不是私密链接”解决办法 背景&#xff1a; charles用了好长时间了&#xff0c;最近发现打开charles有些软件无法上网&#xff0c;浏览器访问网页提示“您的连接不是私密链接”&#xff0c;按照网上的教程重装了几次证书&#x…...

如何通过DNS解析实现负载均衡?

在当今的互联网时代&#xff0c;随着网络应用的飞速发展&#xff0c;网站和各类在线服务面临着海量的用户请求。为了保障服务的高可用性和高性能&#xff0c;负载均衡技术应运而生。DNS&#xff08;域名系统&#xff09;负载均衡作为其中一种重要的实现方式&#xff0c;凭借其简…...

uni-app微信小程序登录流程详解

文章目录 uni-app微信小程序登录流程实战详解微信小程序登录流程概述1. 获取登录凭证&#xff08;code&#xff09;2. 发送登录请求3. 保存登录态4. 登录状态管理5. 应用登录状态请求拦截器中添加 token自动登录页面路由守卫 使用 Vuex 集中管理登录状态登录组件示例登录流程最…...

基于LVS和Keepalived实现高可用负载均衡架构

目录 一、资源清单 二、修改主机名 三、配置调度器 四、配置Web节点服务器&#xff08;web1、web2&#xff09; 五、测试负载均衡 六、测试LVSKeepalived高可用群集 一、资源清单 主机 操作系统 IP地址 lb01 OpenEuler24.03 192.168.16.142 lb02 OpenEuler24.03 …...

微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg

实现效果 效果&#xff1a; 1.微信小程序仿淘宝拍照/照片点位识图、根据点位裁剪生图、图片可裁剪、图片高度可控 2.识别点位自动生成标准构图方案&#xff0c;支持手动微调实现像素级精准裁剪 3.可以根据接口识别的点位信息实现拍照/相册图片特征点自动识别并裁剪 实现步骤 …...

EnumUtils:你的枚举“变形金刚“——让枚举操作不再手工作业

各位枚举操控师们好&#xff01;今天要介绍的是Apache Commons Lang3中的EnumUtils工具类。这个工具就像枚举界的"瑞士军刀"&#xff0c;能让你的枚举操作从石器时代直接跃迁到星际文明&#xff01; 一、为什么需要EnumUtils&#xff1f; 手动操作枚举就像&#xf…...

在Taro中开发一个跨端Svg组件,同时支持小程序、H5、React Native

Taro系列中一直没有跨端的绘图工具&#xff0c;小程序端支持canvas但是不支持svg&#xff0c;RN端有 react-native-svg 支持svg&#xff0c;但是没有很好原生的canvas插件&#xff0c;社区的canvas都是基于WebView实现的&#xff0c;或者skia&#xff0c;这个插件的书写方式和c…...

大型视频学习平台项目问题解决笔记

一 数据库大量读操作导致数据库压力过大的解决方案 1. 优化SQL语句 2. 缓存 二 数据库大量写操作导致数据库压力过大的解决方案 1. 优化SQL语句 2. 改同步写为异步写——解决复杂事务的高并发写 3. 合并写请求——解决简单事务的高并发写&#xff08;额外实现一个异步操作来…...

day18-数据结构引言

一、 概述 数据结构&#xff1a;相互之间存在一种或多种特定关系的数据元素的集合。 1.1 特定关系&#xff1a; 1. 逻辑结构 2.物理结构&#xff08;在内存当中的存储关系&#xff09; 逻辑结构物理结构集合&#xff0c;所有数据在同一个集合中&#xff0c;关系平等顺…...

Android音频解码中的时钟同步问题:原理、挑战与解决方案

一、为什么音频同步如此重要&#xff1f; 在多媒体播放系统中&#xff0c;音频同步问题直接影响用户体验。根据行业研究数据&#xff1a; • 15ms以上的同步偏差&#xff1a;53%的用户能感知到音画不同步 • 超过100ms的偏差&#xff1a;会导致明显的"口型对不上"现…...

深入浅出 iOS 对象模型:isa 指针 与 Swift Metadata

在 iOS 开发中&#xff0c;我们经常听到两个看似神秘的词&#xff1a;isa 指针 和 Metadata。这两个概念分别源自 Objective-C 和 Swift 的对象系统&#xff0c;是我们理解底层运行机制、优化性能乃至调试疑难问题的关键。今天我们就来聊一聊&#xff0c;它们到底是什么&#x…...

ARMV8 RK3399 u-boot TPL启动流程分析 --crt0.S

上一篇介绍到start.S 最后一个指令是跳转到_main, 接下来分析 __main 都做了什么 arch/arm/lib/crt0.S __main 注释写的很详细&#xff0c;主要分为5步 1. 准备board_init_f的运行环境 2. 跳转到board_init_f 3. 设置broad_init_f 申请的stack 和 GD 4. 完整u-boot 执行re…...

Lynx-字节跳动跨平台框架多端兼容Android, iOS, Web 原生渲染

介绍 字节跳动近期开源的跨平台框架Lynx被视为一项重要的技术创新。相较于市场上已有的解决方案如React Native (RN) 和Flutter&#xff0c;Lynx具有独特的特性。 首先&#xff0c;Lynx采用轻量级JavaScript逻辑设计&#xff0c;DOM节点构建完全置于Native层&#xff0c;确保U…...

手机换地方ip地址会变化吗?深入解析

在移动互联网时代&#xff0c;我们经常带着手机穿梭于不同地点&#xff0c;无论是出差旅行还是日常通勤。许多用户都好奇&#xff1a;当手机更换使用地点时&#xff0c;IP地址会随之改变吗&#xff1f;本文将深入解析手机IP地址的变化机制&#xff0c;帮助您全面了解这一常见但…...

Linux——数据库备份与恢复

一&#xff0c;Mysql数据库备份概述 1&#xff0c;数据库备份的重要性 数据灾难恢复&#xff1a;数据库可能会因为各种原因出现故障&#xff0c;如硬件故障、软件错误、误操作、病毒攻击、自然灾害等。这些情况都可能导致数据丢失或损坏。如果有定期的备份&#xff0c;就可以…...

矩阵键盘模块

目录 1.矩阵键盘介绍 2.扫描的概念 数码管扫描&#xff08;输出扫描&#xff09; 矩阵键盘扫描&#xff08;输入扫描&#xff09; 矩阵按键采用逐行扫描&#xff1a; 3.矩阵键盘代码 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1…...

连接词化归律详解

1. 连接词化归律的基本概念 连接词化归律(也称为归结原理)是数理逻辑中用于简化逻辑表达式的重要方法&#xff0c;它允许我们将复杂的逻辑表达式转化为更简单的等价形式&#xff0c;特别是转化为合取范式(CNF)或析取范式(DNF)。 核心思想 连接词化归律基于一系列逻辑等价关系…...

Ubuntu 18.04 iso文件下载

参考&#xff1a;https://blog.csdn.net/Li060703/article/details/106075597 Rufus 官网&#xff1a; https://rufus.ie/zh/ 镜像下载地址 阿里云镜像站&#xff1a;https://mirrors.aliyun.com/ubuntu-releases/18.04/ 网易镜像&#xff1a;http://mirrors.163.com/ub…...

【C#】ToArray的使用

在 C# 中&#xff0c;ToArray 方法通常用于将实现了 IEnumerable<T> 接口的集合&#xff08;如 List<T>&#xff09;转换为数组。这个方法是 LINQ 提供的一个扩展方法&#xff0c;位于 System.Linq 命名空间中。因此&#xff0c;在使用 ToArray 方法之前&#xff0…...

学习日志03 java

最近有点懈怠了&#xff0c;多多实践&#xff0c;多敲代码&#xff0c;多多专注&#xff01; 1 ArithmeticException ArithmeticException 是 Java 中的一个异常类&#xff0c;它继承自 RuntimeException&#xff0c;用于表示在算术运算中出现的错误。这个异常通常在以下情况…...

数据库故障排查指南

对于项目研发来讲&#xff0c;数据库是必不可少的一个重要环节&#xff0c;本文详细总结了项目研发中数据库故障问题排查指南&#xff0c;希望会对大家有所帮助。 数据库连接问题 检查数据库服务是否正常运行&#xff0c;确认网络连接是否畅通&#xff0c;验证数据库配置文件…...

洛谷 P1955 [NOI2015] 程序自动分析

【题目链接】 洛谷 P1955 [NOI2015] 程序自动分析 【题目考点】 1. 并查集 2. 离散化 【解题思路】 多组数据问题&#xff0c;对于每组数据&#xff0c;有多个 x i x j x_ix_j xi​xj​或 x i ≠ x j x_i \neq x_j xi​xj​的约束条件。 所有相等的变量构成一个集合&…...

音视频学习:使用NDK编译FFmpeg动态库

1. 环境 1.1 基础配置 NDK 22b (r22b)FFmpeg 4.4Ubuntu 22.04 1.2 下载ffmpeg 官网提供了 .tar.xz 包&#xff0c;可以直接下载解压&#xff1a; wget https://ffmpeg.org/releases/ffmpeg-4.4.tar.xz tar -xvf ffmpeg-4.4.tar.xz cd ffmpeg-4.41.3 安装基础工具链 sudo …...

OpenHarmony Linux内核本地管理

概述 写这篇文章的初衷&#xff0c;其实也是作者从事多年Android系统开发中&#xff0c;根深蒂固的目录情节导致的&#xff0c;再开发Harmony系统中&#xff0c;总是想模拟Android系统的开发思路。 对于OpenHarmony这个patch机制&#xff0c;其实我很讨厌它&#xff0c;虽然这样…...

2025最新出版 Microsoft Project由入门到精通(六)

目录 三种资源类型的分配方式 成本类资源的分配方式 第一步&#xff1a;切换视图为”任务分配状况“视图 第二步&#xff1a;选中任务→资源→分配资源&#xff0c;打开分配资源窗口选择资源单击”分配“ 资源成本的修改方式 ​编辑工时类资源的分配方式 工时类资源的…...

Tomcat服务部署

目录 一. Tomcat概述 1.1 什么是Tomcat 1.2 安装Tomcat 1.2.1 CentOS7 安装 1.2.2 ubuntu 安装 1.2.3 使用脚本快速安装 二. 配置文件及核心组件 2.1 配置文件 2.1.1 安装目录下文件介绍 2.1.2 conf子目录 2.2 组件 三. tomcat 处理请求过程 四. 常见配置详解 4.…...

Chrome更新到136以后selenium等自动化浏览器失效

Chrome更新到136以后&#xff0c;已经不再支持对默认浏览器数据文件夹进行自动化调试&#xff0c;从而导致selenium在指定user-data-dir为默认路径“C:\Users\{计算机名}\AppData\Local\Google\Chrome\User Data”会报错&#xff0c;相应地的selenium-wire&#xff0c;undetect…...

数据库原理期末考试速成--最后附带两套题

引言 为什么从3开始呢,毕竟是速成吗,总要放弃一些东西 前两章1.概论 2.关系数据库:这里面都是一些运算符什么的,我感觉都学这个:笛卡尔积之列的都会算 这两章比较重要的我就放在这里了 选择、投影、连接、除、并、交、差,其中选择、投影、并、差、笛卡尔积是5种基本关…...

网络基础1(应用层、传输层)

目录 一、应用层 1.1 序列化和反序列化 1.2 HTTP协议 1.2.1 URL 1.2.2 HTTP协议格式 1.2.3 HTTP服务器示例 二、传输层 2.1 端口号 2.1.1 netstat 2.1.2 pidof 2.2 UDP协议 2.2.1 UDP的特点 2.2.2 基于UDP的应用层…...

使用Spring Boot集成Nacos

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它集成了服务发现、服务配置和服务管理等功能&#xff0c;是微服务架构中一个非常重要的组件。以下是使用Spring Boot集成Nacos的详细步骤。 1. 环境准备 确保你已经安装和配置了以下环境&#xff1…...