第三周预习作业(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总结的问题

  1. 细节深度不足:AI对多文件编程的实践细节(如头文件防止重复包含的技巧)和数据类型的具体应用场景(如何时选用shortvs int)总结不够深入。
  2. 代码关联性弱:对《Windows C/C++加密解密实战》中的代码示例(如SM3的三段式实现)仅做概括,未深入分析代码结构与实际应用中的注意事项。
  3. 逻辑结构松散:两本章节的内容(多文件编程与密码学哈希)之间的关联性未充分阐述,例如如何将多文件编程应用于大型密码库的开发。

自己的补充

  1. 多文件编程的实践技巧头文件保护:使用#ifndef#define#endif防止头文件被多次包含。 变量声明:在头文件中用extern声明全局变量,在源文件中定义。 模块化设计:将密码算法(如SM3)独立为单独源文件,通过头文件暴露接口,便于复用和测试。
  2. 数据类型在密码学中的关键应用精确位操作:哈希算法涉及大量位运算(如循环移位、异或),需确保使用无符号类型(如uint32_t)避免符号位干扰。 平台兼容性:使用stdint.h中的固定宽度类型(如uint64_t)保证算法跨平台行为一致。
  3. 杂凑函数的实际安全考量抗碰撞性:SM3设计抵御生日攻击等密码学攻击,实际应用需定期关注密码分析进展。 性能权衡:SHA-256与SM3的性能对比可能影响算法选择,需结合具体硬件评估。

学习思维导图

mindmap root((密码系统设计第三周)) Head First C第4章 多文件编程 文件类型(.c/.h) 编译流程(预处理->编译->汇编->链接) Makefile自动化 数据类型 分类与大小 转换与陷阱 stdint.h跨平台类型 《Windows C/C++加密解密实战》第4章 杂凑函数概述 性质与分类 发展与应用 SM3算法 结构(Merkle-Damgård) 实现(一段式/三段式/OpenSSL) HMAC 原理与实现 HMAC-SM3示例 SHA系列 SHA-256详解 其他成员(SHA-512等) 实践关联 多文件实现密码库 数据类型于位操作

基于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工具

图书

  • 《Head First C》 第4章
  • 《Windows C/C++加密解密实战》 第4章
posted @ 2025-09-28 19:48  20231420  阅读(14)  评论(0)    收藏  举报