第三周预习作业(AI)
AI对学习内容的总结
使用AI工具: 腾讯元宝 (https://yuanbao.tencent.com/)
总结内容:
Head First C第4章:多文件编程与数据类型
本章重点介绍了C语言的多文件编程方法和数据类型的深入理解。
多文件编程:
- 代码组织:通过将大型程序分解为多个源文件(.c)和头文件(.h)提高可维护性和代码复用性。
- 编译与链接:详细说明了从预处理、编译、汇编到链接的完整编译过程,以及如何通过
gcc命令分别编译对象文件(.o)并最终链接成可执行文件。 - Makefile自动化:引入
make工具自动化构建过程,通过定义目标(target)、依赖(dependencies)和配方(recipe)来管理复杂项目的编译,显著提升开发效率。
数据类型:
- 类型分类:复习了基本数据类型(
char,int,short,long,float,double)及其修饰符(unsigned,signed)。 - 类型转换与陷阱:强调了隐式类型转换的风险(如大类型存入小类型导致数据截断),以及显式转换(casting)的必要性。
- 类型大小与极限:通过
sizeof操作符和limits.h/float.h头文件查看不同数据类型在特定平台上的具体大小和取值范围。
《Windows C/C++加密解密实战》第4章:杂凑函数与HMAC
本章深入探讨了密码学中的杂凑函数和基于哈希的消息认证码(HMAC)。
杂凑函数概述:
- 定义与性质:杂凑函数将任意长度输入转换为固定长度输出(哈希值),具备单向性、抗碰撞性等安全特性。
- 发展历程:从最初的非密码学应用发展到现代密码学的核心组件,用于数据完整性验证、数字签名等。
- 分类:分为不带密钥的杂凑函数(如MDC,用于完整性检查)和带密钥的杂凑函数(如MAC,用于认证)。
- 设计结构:多采用迭代型结构(如Merkle-Damgård),处理长消息时先分组再迭代压缩。
SM3杂凑算法:
- 国产密码标准:由中国国家密码管理局发布,输出256位哈希值,采用Merkle-Damgård结构。
- 算法细节:包括常量与函数定义、消息填充、迭代压缩、消息扩展等步骤,强调大端存储格式。
- 实现方式:提供了一段式(单次处理全消息)和三段式(Init-Update-Final)实现代码,并演示了基于OpenSSL的调用方法。
HMAC(基于哈希的消息认证码):
- 原理与结构:通过密钥与消息的两轮哈希运算生成认证码,结合加密和认证功能。
- 实现:以HMAC-SM3为例,展示了如何通过密钥与ipad/opad的异或操作构造安全MAC。
SHA系列算法:
- 家族概述:包括SHA-1(已不安全)、SHA-2(如SHA-256、SHA-512)和SHA-3,简述其发展史和主要特性。
- SHA-256详解:逐步解析其常量初始化、消息预处理、逻辑运算及压缩函数工作原理,附伪代码说明。
对AI总结的反思与补充
AI总结的问题
- 细节深度不足:AI对多文件编程的实践细节(如头文件防止重复包含的技巧)和数据类型的具体应用场景(如何时选用
shortvsint)总结不够深入。 - 代码关联性弱:对《Windows C/C++加密解密实战》中的代码示例(如SM3的三段式实现)仅做概括,未深入分析代码结构与实际应用中的注意事项。
- 逻辑结构松散:两本章节的内容(多文件编程与密码学哈希)之间的关联性未充分阐述,例如如何将多文件编程应用于大型密码库的开发。
自己的补充
- 多文件编程的实践技巧: 头文件保护:使用
#ifndef、#define、#endif防止头文件被多次包含。 变量声明:在头文件中用extern声明全局变量,在源文件中定义。 模块化设计:将密码算法(如SM3)独立为单独源文件,通过头文件暴露接口,便于复用和测试。 - 数据类型在密码学中的关键应用: 精确位操作:哈希算法涉及大量位运算(如循环移位、异或),需确保使用无符号类型(如
uint32_t)避免符号位干扰。 平台兼容性:使用stdint.h中的固定宽度类型(如uint64_t)保证算法跨平台行为一致。 - 杂凑函数的实际安全考量: 抗碰撞性:SM3设计抵御生日攻击等密码学攻击,实际应用需定期关注密码分析进展。 性能权衡:SHA-256与SM3的性能对比可能影响算法选择,需结合具体硬件评估。
学习思维导图
基于AI的学习
使用AI工具: 腾讯元宝
学习内容: 针对“多文件编程中头文件的作用”和“SM3杂凑算法的填充过程”两个知识点进行苏格拉底式提问。
对话过程:
1. 针对“多文件编程中头文件的作用”
我: 我正在学习多文件编程中头文件的作用,请你以苏格拉底的方式对我进行提问,一次一个问题。
AI: 好的。首先,为什么在C语言中我们需要使用头文件(.h文件)?
我: 头文件用于声明函数、宏和全局变量,这样多个源文件可以共享这些声明,避免重复代码。
AI: 正确。那么,如果在两个不同的源文件中包含同一个头文件,如何防止声明被重复包含导致编译错误?
我: 使用预处理指令#ifndef、#define和#endif来包围头文件内容,确保头文件只被包含一次。
AI: 很好。你能举例说明头文件中通常包含哪些内容吗?
我: 通常包含函数声明、宏定义、类型定义(如typedef和struct)和外部变量声明(用extern关键字)。
AI: 那么,头文件中的函数声明和函数定义有什么区别?为什么不能将定义放在头文件中?
我: 函数声明只是告诉编译器函数的签名(返回类型和参数),而定义是函数的实际实现。如果将定义放在头文件中,多个源文件包含该头文件会导致函数被多次定义,链接时出错。
AI: 完美!你已经理解了头文件的核心作用和使用方法。
2. 针对“SM3杂凑算法的填充过程”
我: 我想理解SM3杂凑算法的填充过程,请继续用苏格拉底方式提问。
AI: 首先,为什么杂凑算法如SM3需要对消息进行填充?
我: 因为杂凑算法处理固定大小的分组(如SM3是512位),填充确保消息长度是分组的整数倍,同时包含原始长度信息。
AI: 正确。SM3填充的具体步骤是什么?
我: 首先在消息末尾添加一个比特'1',然后添加k个'0',使得填充后的长度满足(消息长度 + 1 + k) ≡ 448 mod 512。最后添加一个64位块表示原始消息长度。
AI: 为什么填充要确保长度模512等于448?
我: 因为448 + 64(长度字段)=512,正好是一个分组的长度,这样总长度是512的整数倍。
AI: 很好。你能解释一下填充中长度字段的编码方式吗?
我: 长度字段是原始消息长度的二进制表示,以64位大端格式附加在填充后面。
AI: 如果消息长度本身已经满足条件,还需要填充吗?
我: 需要,至少添加一个比特'1'和长度字段,因此填充至少增加65位(1位'1'和64位长度),可能跨越两个分组。
我: 针对我学的这两个知识点,我理解了吗?
AI: 从你的回答来看,你对头文件的作用和防护机制非常清晰。对于SM3填充,你准确理解了填充的目的、步骤和细节,包括长度字段的处理和边界情况。我认为你已经很好地掌握了这两个知识点。
我: 我的回答结束了,请对我的回答进行评价总结。
AI: 你的表现非常出色。在关于头文件的讨论中,你不仅能解释其作用,还能深入理解重复包含问题和实际内容组织。在SM3填充的讨论中,你展示了对其原理和细节的扎实掌握,包括模运算的意义和长度编码。这表明你不仅记住了概念,还进行了有效思考。继续保持!
学习实践过程遇到的问题与解决方式
问题1:在Windows下使用MinGW编译多文件项目时,链接错误提示未找到函数定义。
- 解决过程:
- 询问AI:描述错误信息,询问可能的原因。
- AI分析:AI指出可能原因是源文件未一起编译链接,或者函数声明与定义不匹配(如名称修饰问题)。
- 验证与实施:检查编译命令,确保所有源文件(.c)都列入编译列表。使用
gcc -c分别编译每个源文件生成对象文件(.o),再用gcc *.o -o program链接。确认头文件中的函数声明与源文件中的定义完全一致(包括返回值类型和参数类型)。 - 结果:修正编译命令后链接成功。
问题2:在实现SM3算法的三段式接口时,多次调用update后结果与单次调用不一致。
- 解决过程:
- 自主分析:怀疑是中间状态(上下文结构体)在多次调用间未正确维护。
- 检查代码:对比教材代码,发现上下文结构体中的消息总长度字段(bit数)在
update时更新逻辑有误,未正确处理多次调用累加。 - 询问AI:向AI描述问题现象,询问SM3三段式实现中上下文结构体关键字段的维护要点。
- AI确认:AI强调上下文需维护当前分组数据、累计长度、当前哈希中间值等,并提示长度字段应累加每次
update的数据长度(以位为单位)。 - 正确操作:修正上下文结构体的长度更新逻辑,确保每次
update后累加的是新数据的实际长度(字节数*8)。 - 总结:理解了三段式哈希算法中上下文维护的重要性,特别是长度字段需精确记录所有已处理数据的位长度。
参考资料
AI工具
- 腾讯元宝 (https://yuanbao.tencent.com/)
图书
- 《Head First C》 第4章
- 《Windows C/C++加密解密实战》 第4章

浙公网安备 33010602011771号