《密码系统设计》第四周
第四周预习报告
学习内容
- Head First C 嗨翻 C 语言 第5章
- 《Windows C/C++加密解密实战》第 6,8,13,14 章
- 重点第14 章,第 6 章了解 ,第 8,13 参考
- 课程 mindmap
- 报告内容参考第一周
AI 对学习内容的总结(1分)
要求
- 让AI阅读学习内容并进行总结
总结
1. Head First C 嗨翻 C 语言 第5章
- 结构(Structs):结构允许你将不同的数据类型组合成一个单一的数据结构。例如,你可以创建一个结构来表示一个人,其中包含姓名(字符串)、年龄(整数)和身高(浮点数)等字段。
- 联合(Unions):联合是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型。这在你需要节省内存空间或者处理不确定类型数据时非常有用。
- 位字段(Bit Fields):位字段允许你访问和操作单个位,这在处理硬件或者需要精确内存控制的低级编程中非常有用。
- 结构指针(Pointers to Structures):学习如何使用指针来访问和修改结构中的数据。
- 嵌套结构(Nested Structures):了解如何在一个结构中包含另一个结构,这对于创建复杂的数据模型非常有用。
- 函数与结构(Functions and Structures):学习如何将结构作为参数传递给函数,以及如何从函数返回结构。
- 动态内存与结构(Dynamic Memory and Structures):探讨如何在堆上为结构分配内存,以及如何管理这些内存
- 枚举(Enums):枚举是一种用户定义的类型,它允许你为一组相关的值定义一个名字。这在处理具有预定义选项的数据时非常有用。
- 使用
struct
创建复杂数据类型:学习如何使用struct
关键字来定义自己的复杂数据类型。
2. 《Windows C/C++加密解密实战》第14章 SM2算法的实现
- SM2算法的推出背景:
- 为了提高信息系统的安全性,中国推出了基于ECC的SM2算法,以替换RSA算法。
- 随着计算技术的发展,传统的RSA算法面临安全威胁,SM2算法提供了更安全的替代方案。
- SM2算法的特点:
- SM2算法是ECC算法的改进版,提供了更高的安全性。
- 推荐使用256位的曲线作为标准曲线。
- 算法包括数字签名、加密解密和密钥交换等应用。
- 椭圆曲线密码体制的不足:
- 实现相对复杂,涉及点乘运算和求逆运算。
- 设计不当可能导致计算速度不理想。
- 安全参数选取复杂。
- 椭圆曲线的研究热点:
- 快速产生椭圆曲线参数。
- 椭圆曲线密码算法的改进。
- 椭圆曲线密码系统的实现。
- SM2算法基于的椭圆曲线性质:
- 在有限域上,椭圆曲线构成有限交换群。
- 椭圆曲线多倍点运算构成单向函数。
- 有限域上的椭圆曲线:
- 介绍了Fq的定义和元素表示,包括素域Fq和二元扩域。
- 椭圆曲线系统参数及其验证:
- 描述了椭圆曲线系统参数的一般要求和验证方法。
- 包括Fp和二元扩域上的椭圆曲线系统参数及其验证。
- 密钥对的生成:
- 介绍了如何使用椭圆曲线系统参数生成密钥对。
- 公钥的验证:
- 描述了如何验证Fp和二元扩域上的椭圆曲线公钥的有效性。
对 AI 总结的反思与补充(2分)
要求
- AI总结的问题
- 自己的补充
反思与补充
1. 反思
在学习中利用AI助手对知识点进行总结,可以帮助我们对知识点进行梳理,有助于我们更全面地理解、掌握学习内容。同时,AI助手还能帮助我们对不理解的知识点展开更为详细的解释,确保我们能对所学内容清晰掌握。
- 《Head First C 嗨翻 C 语言》第5章的内容提供了创建和管理复杂数据结构的工具和概念,是理解C语言中更高级的数据管理技术的关键。通过这些学习,能够更好地模拟现实世界中的对象和概念,并在程序中有效地使用它们。
- 通过学习《Windows C/C++加密解密实战》第14章 ,可以了解到SM2算法的基本原理、实现方式以及如何进行密钥对的生成和公钥的验证,对于理解和应用SM2算法在加密解密领域非常重要。
2. 补充
1. Head First C 嗨翻 C 语言 第5章
- 结构体和联合的初始化:学习如何初始化结构体和联合,包括使用指定初始化器和复合字面量。
- 结构体和联合的动态分配:除了在栈上定义结构体和联合,了解如何在堆上动态分配它们,以及如何正确地释放分配的内存。
- 位字段的大小和类型:深入了解位字段的使用,包括如何确定位字段的大小和类型,以及如何处理位字段的溢出。
- 函数指针与结构体:结合第7章的内容,考虑如何将函数指针与结构体结合使用,以实现回调函数和事件驱动编程。
- 代码的可读性和维护性:在使用结构体和联合时,考虑如何编写清晰、易于维护的代码,包括合理的命名约定、注释的使用,以及逻辑的组织。
2. 《Windows C/C++加密解密实战》第14章 SM2算法的实现
算法的安全性和效率:SM2算法在实际应用中的安全性和效率,以及它如何与现有的加密算法(如RSA)相比较。
学习思维导图(2分)
要求
- Mermaid 代码与截图(参考Mermaid MindMap语法)或者提交思维导图链接(如果使用线上编辑器,推荐processon,xmind,…)
思维导图
1. Head First C 嗨翻 C 语言 第5章
2. 《Windows C/C++加密解密实战》第14章 SM2算法的实现
基于 AI 的学习(2分)
要求
- 至少找到自己理解不是太好 2 个概念,让 AI 对自己进行苏格拉底提问
- 参考下面提示语或者使用 AI Agent
提示词:“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
- 核心是要求AI工具:“请你以苏格拉底的方式对我进行提问”
- 然后AI工具就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
- 如果你觉得差不多了,可以先问问AI工具:“针对我XXX知识点,我理解了吗?”
- AI工具会给出它的判断,如果你也觉得自己想清楚了,可以最后问AI工具:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
学习内容
1. 针对SM2算法的实现中密钥对的生成进行提问
- “我在学习SM2算法的实现中密钥对的生成相关知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
- “当然,让我们开始吧。1. 你知道SM2算法是基于哪种数学难题吗?”
- “常用的1024位RSA算法面临严重的安全威胁”
- “既然RSA算法的安全性已经受到了挑战,那么SM2算法是如何提供更高安全性的呢?”
“SM2算法是基于椭圆曲线密码学(ECC)的,它提供了与RSA相同的安全级别,但密钥长度更短,这意味着它的计算效率更高,同时提供了更强的抗攻击能力。SM2算法包括数字签名、密钥交换和公钥加密三个部分,它使用的是256位的椭圆曲线,这使得它在保持较高安全性的同时,计算和存储的需求都比RSA算法要低。”
“在SM2算法中,密钥对是如何生成的?”
“在SM2算法中,密钥对的生成首先涉及生成一个私钥,私钥是一个随机选择的整数。然后,使用这个私钥与椭圆曲线上的一个预定的基点进行点乘运算,得到的结果是公钥。公钥是椭圆曲线上的一个点,它与私钥一一对应。”
“SM2算法的数字签名是如何工作的?”
“数字签名在SM2算法中涉及到使用私钥对信息的散列值进行签名,生成签名。然后使用公钥对接收到的签名和消息进行验证,确保签名的有效性。这个过程可以确保消息的完整性和不可否认性。”
“SM2算法在实际应用中有哪些场景?”
“SM2算法的应用场景包括安全通信、数字签名、身份认证和数据保护等。它被用于加密电子邮件、即时通讯等通信内容,保护通信的机密性和完整性。在电子合同、电子票据等场景中,SM2算法用于生成和验证数字签名,确保文件的不可否认性和真实性。此外,SM2算法也被用于实现安全的身份认证机制,如在电子政务、金融服务等领域。”
“SM2算法面临的挑战和未来的展望是什么?”
“尽管SM2算法具有诸多优势,但在实际应用中也面临一些挑战,如普及度、性能优化和标准化。随着技术的不断发展和应用的深入,SM2算法有望在未来的信息安全领域扮演更加重要的角色。” - “针对我SM2算法的实现中密钥对的生成知识点,我理解了吗?”
- “你已经了解了SM2算法密钥对生成的基本过程,包括以下几个关键点:1. 随机私钥:首先生成一个随机整数作为私钥。2. 椭圆曲线上的基点:选择一个在椭圆曲线上的预定基点。3. 点乘运算:使用私钥与基点进行点乘运算,得到公钥。4. 公钥和私钥的对应关系:公钥是椭圆曲线上的一个点,与私钥存在一一对应关系。”
2. 针对C语言动态内存与结构进行提问
- “我在学习C语言动态内存与结构相关知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
- “当然可以,让我们开始吧。
在C语言中,动态内存分配的目的是什么?” - “1.可以控制所开辟的内存大小
在很多时候,比如通讯录,学生管理表等等,我们不知道在为了会存下多少联系人,多少学生。如果我们用静态内存开辟就存在问题,可能会开辟少了,之后联系人和学生都存不了,可能会开辟多了,导致内存浪费。而动态内存就可以解决这个问题,我们可以用relloc控制大小,当内存达到申请的空间时,我们可以主动再申请连续的空间,进行扩容。
2.可以多次利用这部分空间
静态内存分配的空间,只有在程序结束时才会自动释放给系统。如果你都在栈区上开辟空间,对于大程序来说,还没运行完,内存就可能被占完了,此时就会发生内存泄漏。
而动态内存分配的空间,如果你用完了(比如你开辟了一块空间,打印10个元素,打印好了),我们可以用free()函数释放这块空间,并把维护这块空间的指针置为空指针。当再次用动态内存申请空间时,就可以再次利用这块空间。一定程度上可以节省空间。” - “很好,你已经理解了动态内存分配的主要目的和优势。那么,我的下一个问题:
在C语言中,如何使用malloc函数进行动态内存分配?” - “void *malloc(size_t size);其中size参数是需要分配的内存字节数”
- “正确,malloc函数用于分配指定大小的内存块。那么,请问:
如果malloc函数调用成功,它将返回什么?如果调用失败,它又会返回什么?” - “如果malloc函数调用成功,它将返回一个指向分配内存的指针;如果调用失败,它将返回NULL”
- “完全正确,malloc在成功时返回一个非空指针,失败时返回NULL。接下来的问题:
在使用malloc分配内存后,如果不再需要这块内存,应该使用哪个函数来释放它?” - “free函数”
- “确实,
free
函数用于释放之前用malloc
分配的内存。那么,请问:
在释放内存后,指针会发生什么变化?我们应该如何管理指针以避免悬垂指针问题?” - “你的回答是什么?”
- 在释放内存后,指针本身不会自动改变,它仍然指向之前分配的内存地址。但是,由于那部分内存已经被释放,所以不应该再通过这个指针访问该内存区域,否则会导致未定义的行为,这通常被称为“悬垂指针”(dangling pointer)。
为了避免悬垂指针问题,应该采取以下措施:
- 置空指针:释放内存后,应立即将指针设置为
NULL
。这样,如果后续代码不小心尝试解引用该指针,将会是一个安全的空操作。free(pointer); pointer = NULL;
- 检查指针:在对指针进行操作之前,检查它是否为
NULL
,可以避免对空指针解引用。 - 使用智能指针:如果使用C++,可以考虑使用智能指针(如
std::unique_ptr
或std::shared_ptr
),它们会自动管理内存的生命周期。 - 避免重复释放:确保内存只被释放一次,重复释放已释放的内存会导致未定义的行为。
- 使用内存管理工具:使用如 Valgrind 等内存调试工具可以帮助检测内存泄漏和悬垂指针问题。
通过这些措施,可以更安全地管理动态分配的内存,并减少内存相关的错误。
作业提交要求(1分)
- 提交Markdown 文件,文档命名“学号姓名《密码系统设计》.md”
- 提交Markdown 文件转为 PDF,文档命名“学号姓名《密码系统设计》第 X 周.pdf”
- 提交代码托管链接(可选):学号姓名 gitee(github) 链接
- 内容质量高有加分
参考资料
- AI工具(你使用的AI工具及其链接)
- Kimi
- 图书
- 《Windows C/C++加密解密实战》
- Head First C 嗨翻 C 语言