文章目录
密码系统设计
推荐VSCode中安装Markdown插件和markdown pdf 插件完成作业
第三周预习报告
学习内容
学习内容
- Head First C 嗨翻 C 语言 第4章
- 《Windows C/C++加密解密实战》第4章
- 重点 4.2,4.3, 4.5
- 课程 mindmap
AI 对学习内容的总结(1分)
要求
- 让AI(kimi,元宝等)阅读学习内容并进行总结,教材内容可以使用微信读书或者云班课电子教材
总结
Head First C 嗨翻 C 语言 chapter 4
第四章主要讲述了如何使用C语言处理多个源文件,以及如何通过分离声明和定义来组织代码。以下是对本章内容的总结:
-
数据类型简介:介绍了C语言中的基本数据类型,包括
char
、int
、short
、long
、float
、double
,并解释了它们在内存中的存储方式和用途。 -
数据类型的大小:讨论了不同平台上数据类型大小可能不同的情况,并介绍了如何使用
limits.h
和float.h
头文件中的宏来获取数据类型的具体大小。 -
编译多个源文件:解释了如何在C程序中使用多个源文件,以及如何通过编译器将它们组合成一个单独的可执行文件。
-
分离声明和定义:为了解决编译器在遇到未知函数调用时可能做出的错误假设,引入了函数声明的概念。通过在头文件中声明函数,可以避免在源文件中重复定义函数。
-
创建头文件:介绍了如何创建和使用头文件来包含函数声明,这样其他源文件就可以通过包含这个头文件来了解函数的原型。
-
编译过程:详细描述了编译过程的四个步骤:预处理、编译、汇编和链接。
-
编译优化:讨论了如何通过保存编译后的代码到对象文件(
.o
文件)来加快编译速度,以及如何通过make
工具自动化编译过程。 -
使用
make
工具:介绍了make
工具的基本概念,包括如何创建makefile
来定义目标文件、依赖关系和编译规则。 -
代码组织:强调了将声明和定义分离到不同的文件中,可以提高代码的可读性和可维护性。
-
代码复用:通过将共享的代码放入单独的源文件中,并使用头文件来声明这些函数,可以在不同的程序之间复用代码。
本章通过介绍如何有效地组织和编译C程序的多个源文件,帮助读者理解了大型C程序的结构和编译过程。同时,也介绍了如何使用make
工具来自动化编译任务,从而提高开发效率。
《Windows C/C++加密解密实战》第四章
第四章主要探讨了杂凑函数和HMAC(Hash-Based Message Authentication Code,基于哈希的消息认证码)的相关知识。以下是对本章内容的总结:
-
杂凑函数概述:
- 杂凑函数是一种将任意长度的输入数据转换为固定长度输出的算法。
- 杂凑函数具有单向性,即从输出难以逆推出输入。
- 杂凑函数在信息安全中用于数据完整性验证和数字签名等。
-
密码学和杂凑函数:
- 杂凑函数在密码学中的应用包括消息认证、数字签名等。
- 杂凑函数的发展与公钥密码体制的出现密切相关。
-
杂凑函数的设计和分类:
- 杂凑函数可以分为基于分组密码的杂凑函数和直接构造的杂凑函数。
- 杂凑函数可以是有密钥的(如HMAC)和无密钥的(如MD5、SHA-1)。
-
杂凑函数的碰撞:
- 碰撞是指不同的输入产生相同的杂凑值,这是杂凑函数安全性的重要考量。
-
SM3杂凑算法:
- SM3是中国国家密码管理局公布的密码杂凑算法标准。
- SM3算法的消息分组为512比特,输出杂凑值为256比特。
- SM3算法采用Merkle-Damgard结构,并具有复杂的压缩函数和消息拓展过程。
-
HMAC:
- HMAC是一种结合了密钥的杂凑函数,用于提供消息的完整性和认证。
- HMAC通过结合密钥和哈希函数来生成一个固定长度的认证码。
-
SHA系列:
- SHA系列算法的核心思想和特点
- SHA算法的安全性
- OpenSSL实现SHA算法
- OpenSSL实现SM3算法:
- OpenSSL库提供了SM3算法的实现,可以通过OpenSSL的EVP接口进行调用。
本章内容涵盖了杂凑函数的基本概念、设计原则、应用场景以及相关的编码技术,为理解信息安全中的数据处理和认证机制提供了基础。
对 AI 总结的反思与补充(2分)
要求
- AI总结的问题
- 自己的补充
反思与补充
- 信息过载:在处理大量信息时,AI可能难以区分哪些信息是关键的,哪些是次要的,这可能导致总结不够精炼。
- 解释性:AI的决策过程可能不够透明,这使得用户难以理解其总结背后的逻辑。
- 在此我还要补充《Windows C/C++加密解密实战》第四章还有个关于SHA系列杂凑算法的内容
SHA即安全哈希算法。具有单向性。该系列算法包括SHA256算法、SHA384算法、SHA512算法。本书还会讲到如何基于OpenSSL的SHA算法
学习思维导图(2分)
要求
- Mermaid 代码与截图(参考Mermaid MindMap语法)或者提交思维导图链接(如果使用线上编辑器,推荐processon,xmind,…)
思维导图
下面是个简单mermaid的思维导图,你可以根据你自己的需求修改
mindmap
root((密码系统设计第三周))
教材
WindowsC/C++加密解密实战 第四章
杂凑函数概述
密码学和杂凑函数
杂凑函数的设计和分类
杂凑函数的碰撞
SM3杂凑算法
HMAC
SHA系列杂凑算法
基于OpenSSL的哈希运算
Head First.C chapter 4
数据类型简介
数据类型的大小
编译多个源文件
分离声明和定义
创建头文件
编译过程、优化
使用make工具
代码组织、复用
课件
网络空间安全
密码与密码系统
法律法规与标准
密码应用与密评
实践
gitee(github)
openssl
gmssl
基于 AI 的学习(2分)
要求
- 至少找到自己理解不是太好 2 个概念,让 AI 对自己进行苏格拉底提问
- 参考下面提示语或者使用 AI Agent
提示词:“我在学习XXX知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
- 核心是要求AI工具:“请你以苏格拉底的方式对我进行提问”
- 然后AI工具就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
- 如果你觉得差不多了,可以先问问AI工具:“针对我XXX知识点,我理解了吗?”
- AI工具会给出它的判断,如果你也觉得自己想清楚了,可以最后问AI工具:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
学习内容
me
我在学习如何使用C语言处理多个源文件,以及如何通过分离声明和定义来组织代码,请你以苏格拉底的方式对我进行提问,一次一个问题
AI
你是否知道如何创建一个头文件,并在多个源文件中包含它?
me
创建头文件并在多个源文件中包含它的步骤如下:
创建头文件:
- 首先,你需要创建一个新的文件,通常使用
.h
扩展名来表示这是一个头文件。例如,你可以创建一个名为myfunctions.h
的文件。编写函数声明:
- 在头文件中,你需要声明你希望在多个源文件中共享的函数。这些声明告诉编译器函数的名称、返回类型和参数类型,但不包含函数的具体实现(即函数体)。
a, float b); ``` 3. **保存头文件**: - 将头文件保存在你的项目目录中,确保它可以被项目的其他部分访问。 4. **在源文件中包含头文件**: - 在每个需要使用这些共享函数的源文件的顶部,使用 `#include` 指令来包含头文件。使用双引号来指定本地头文件的路径。 ```c // main.c #include "myfunctions.h" int main() { function1(); int result = function2(5, 3.14); return 0; } ``` 5. **编写函数定义**: - 在一个源文件中提供这些函数的具体实现。这个文件将包含函数声明和函数定义。 ```c // myfunctions.c #include "myfunctions.h" void function1(void) { // 实现 function1 } int function2(int a, float b) { // 实现 function2 return a + (int)b; } ``` 6. **编译项目**: - 当你编译项目时,确保编译器能够找到头文件和源文件。如果你使用命令行编译器如 `gcc`,你可以一次性编译所有相关的源文件和头文件。 ```bash gcc -o myprogram main.c myfunctions.c ``` 7. **维护代码**: - 通过分离声明和定义,你可以更容易地维护代码。如果需要修改函数,你只需在一个地方更新定义,而所有包含头文件的源文件都会自动获得更新。 通过这种方式,头文件允许你在一个项目中多个不同的源文件之间共享函数声明,而不需要重复代码,这有助于保持代码的整洁和一致性。
AI
当你修改了程序中的一个文件,你如何确保只重新编译这个文件,而不是整个项目?
me
要确保在修改程序中的一个文件后只重新编译该文件,而不是整个项目,你可以采取以下步骤:
使用编译器的
-o
选项: 如果你使用的是像gcc
这样的编译器,可以通过-o
选项指定输出文件的名称。但是,这种方法不会自动只编译修改过的文件。使用对象文件: 编译器通常允许你先编译源文件生成对象文件(
.o
文件),然后再将这些对象文件链接成最终的可执行文件。例如:bash gcc -c source1.c -o source1.o gcc -c source2.c -o source2.o gcc source1.o source2.o -o program
这样,只有修改过的源文件需要重新编译成新的对象文件。使用
make
工具:make
是一个强大的工具,它可以自动检测哪些文件被修改了,并只重新编译这些文件。你需要创建一个
makefile
,其中包含有关如何编译和链接程序的指令。例如: ```makefile program: source1.o
source2.o
gcc source1.o source2.o -o programsource1.o: source1.c
gcc -c source1.csource2.o: source2.c
gcc -c source2.c ```当你运行make
命令时,它会自动编译所有已修改的源文件,并重新链接程序。使用增量构建系统: 一些现代的构建系统,如 CMake 或 Bazel,提供了更高级的增量构建功能,它们可以处理复杂的依赖关系,并确保只编译和链接必要的文件。
使用集成开发环境(IDE): 许多IDE,如 Visual Studio、Eclipse 或 CLion,都有内置的构建系统,它们可以自动检测文件的更改并只重新编译这些文件。
通过这些方法,你可以有效地减少编译时间,特别是在大型项目中,这可以显著提高开发效率。
AI
你了解make工具是如何帮助你自动化编译过程的吗?
me
make
工具通过以下方式帮助自动化编译过程:
依赖关系:
make
工具通过分析makefile
中定义的依赖关系来确定哪些文件自上次构建以来已经发生了变化。makefile
中的规则指定了每个目标文件(通常是对象文件或可执行文件)依赖于哪些源文件。规则定义:在
makefile
中,你可以为每个目标定义规则,这些规则指定了如何从依赖的源文件生成目标文件。规则包括执行的命令,通常是编译命令。自动检测:当你运行
make
命令时,make
会比较目标文件和依赖文件的时间戳。如果依赖文件比目标文件新,make
会认为目标文件已过时,并需要重新生成。执行规则:对于需要更新的目标文件,
make
会执行相应的规则中的命令来重新生成目标文件。递归构建:如果一个目标文件依赖于其他目标文件,
make
会递归地构建这些依赖的文件,确保所有依赖链上的所有文件都是最新的。并行构建:在一些较新的
make
实现中,make
可以并行构建多个目标,进一步提高构建速度。错误处理:如果构建过程中出现错误,
make
会停止构建并报告错误,这样你可以修复问题后再重新运行make
。增量构建:
make
只构建那些自上次成功构建以来已经发生变化的部分,而不是每次都完整地重新构建整个项目。可配置性:
makefile
可以包含条件语句、变量和复杂的逻辑,使得构建过程可以根据不同的配置或平台进行定制。通过这些特性,
make
工具使得编译过程自动化、高效且易于管理,特别是在大型项目和复杂项目中,make
可以显著提高编译和构建的效率。
me
我在学习杂凑函数的概述、分类,和杂凑函数的碰撞的相关知识点,请你以苏格拉底的方式对我进行提问,一次一个问题
AI
杂凑函数的主要特点有哪些?
me
杂凑函数的主要特点包括:
- 确定性:对于同一输入总是产生相同的输出。
- 快速计算:杂凑函数的设计使得它可以快速计算出输出。
- 抗碰撞性:对于不同的输入,很难找到能够产生相同输出的两个输入,即很难找到两个不同的输入,使得它们的杂凑值相同。
- 单向性:从杂凑值几乎不可能逆向推导出原始输入。
- 输入敏感性:输入的微小变化会导致输出的显著变化。
- 固定长度的输出:无论输入数据的大小如何,输出总是固定长度的。
- 随机性:输出看起来应该是随机的,没有明显的模式或结构。
这些特点使得杂凑函数在数据完整性验证、数字签名、密码学协议等多个领域中非常有用。
AI
杂凑函数的抗碰撞性是如何定义的?
me
抗碰撞性是杂凑函数的一个重要安全特性,它通常定义为以下两个方面:
第一预像抗碰撞性:对于一个给定的杂凑值,攻击者很难找到一个原始输入(即预像),使得杂凑函数对该输入的杂凑运算结果与给定的杂凑值相匹配。换句话说,即使知道杂凑值,也很难逆向推导出任何对应的原始数据。
第二预像抗碰撞性:即使给定一个原始输入及其对应的杂凑值,攻击者也很难找到另一个不同的输入,使得杂凑函数对这个不同输入的杂凑运算结果与已知的杂凑值相同。这意味着找到任何两个不同的输入,它们具有相同的杂凑值,是困难的。
在实际应用中,如果一个杂凑函数能够抵抗这两种碰撞攻击,那么它就被认为是具有很好的抗碰撞性的。这种特性对于确保数据的完整性和认证是非常重要的,尤其是在数字签名和密码学协议中。
AI
你能解释一下什么是杂凑函数的碰撞吗?
me
当然可以。杂凑函数的碰撞是指两种不同的情况:
第一类碰撞:当两个不同的输入消息经过杂凑函数处理后,产生了相同的杂凑值。这种情况在理论上是可能的,因为杂凑函数将大量可能的输入压缩成固定长度的输出,所以不同的输入有可能映射到同一个输出。这种现象在数学上被称为“泵送”(pumping
lemma)。第二类碰撞:当攻击者能够故意找到两个不同的输入消息,使得这两个消息的杂凑值相同。这通常被视为杂凑函数的一个安全漏洞,因为它破坏了杂凑函数的抗碰撞性,这是杂凑函数的一个重要安全特性。
在安全的杂凑函数设计中,尽管第一类碰撞在理论上是可能的,但实际上要找到这样的碰撞应该是极其困难的,以至于在实际应用中可以忽略不计。而对于第二类碰撞,一个安全的杂凑函数应该使得即使在知道其中一个输入和对应的杂凑值的情况下,找到另一个不同的输入也是不可行的。
学习实践过程遇到的问题与解决方式(AI 驱动,优先使用AI工具解决问题)(2分)
至少两个
- AI在阅读教材时遗漏了教材第四章SHA系列杂凑算法的相关知识点。
于是,我通过阅读教材,并就关键知识点询问AI进行了补充。 - AI在总结教材知识点时还是存在不细致、过于粗浅的情况。
我通过让AI进行苏格拉底提问,让我通过查询,对相应的疑问进行解答。
作业提交要求(1分)
- 提交Markdown 文件,文档命名“学号姓名《密码系统设计》.md”
- 提交Markdown 文件转为 PDF,文档命名“学号姓名《密码系统设计》第 X 周.pdf”
- 提交代码托管链接(可选):学号姓名 gitee(github) 链接
- 内容质量高有加分
参考资料
- AI工具(你使用的AI工具及其链接)
- 图书
- 网站