《密码系统设计》第四周

第四周预习报告

学习内容

AI 对学习内容的总结(1分)

要求

  • 让AI阅读学习内容并进行总结

总结

1. Head First C 嗨翻 C 语言 第5章

  1. 结构(Structs):结构允许你将不同的数据类型组合成一个单一的数据结构。例如,你可以创建一个结构来表示一个人,其中包含姓名(字符串)、年龄(整数)和身高(浮点数)等字段。
  2. 联合(Unions):联合是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型。这在你需要节省内存空间或者处理不确定类型数据时非常有用。
  3. 位字段(Bit Fields):位字段允许你访问和操作单个位,这在处理硬件或者需要精确内存控制的低级编程中非常有用。
  4. 结构指针(Pointers to Structures):学习如何使用指针来访问和修改结构中的数据。
  5. 嵌套结构(Nested Structures):了解如何在一个结构中包含另一个结构,这对于创建复杂的数据模型非常有用。
  6. 函数与结构(Functions and Structures):学习如何将结构作为参数传递给函数,以及如何从函数返回结构。
  7. 动态内存与结构(Dynamic Memory and Structures):探讨如何在堆上为结构分配内存,以及如何管理这些内存
  8. 枚举(Enums):枚举是一种用户定义的类型,它允许你为一组相关的值定义一个名字。这在处理具有预定义选项的数据时非常有用。
  9. 使用struct创建复杂数据类型:学习如何使用struct关键字来定义自己的复杂数据类型。

2. 《Windows C/C++加密解密实战》第14章 SM2算法的实现

  1. SM2算法的推出背景
  • 为了提高信息系统的安全性,中国推出了基于ECC的SM2算法,以替换RSA算法。
  • 随着计算技术的发展,传统的RSA算法面临安全威胁,SM2算法提供了更安全的替代方案。
  1. SM2算法的特点
  • SM2算法是ECC算法的改进版,提供了更高的安全性。
  • 推荐使用256位的曲线作为标准曲线。
  • 算法包括数字签名、加密解密和密钥交换等应用。
  1. 椭圆曲线密码体制的不足
  • 实现相对复杂,涉及点乘运算和求逆运算。
  • 设计不当可能导致计算速度不理想。
  • 安全参数选取复杂。
  1. 椭圆曲线的研究热点
  • 快速产生椭圆曲线参数。
  • 椭圆曲线密码算法的改进。
  • 椭圆曲线密码系统的实现。
  1. SM2算法基于的椭圆曲线性质
  • 在有限域上,椭圆曲线构成有限交换群。
  • 椭圆曲线多倍点运算构成单向函数。
  1. 有限域上的椭圆曲线
  • 介绍了Fq的定义和元素表示,包括素域Fq和二元扩域。
  1. 椭圆曲线系统参数及其验证
  • 描述了椭圆曲线系统参数的一般要求和验证方法。
  • 包括Fp和二元扩域上的椭圆曲线系统参数及其验证。
  1. 密钥对的生成
  • 介绍了如何使用椭圆曲线系统参数生成密钥对。
  1. 公钥的验证
  • 描述了如何验证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章

  1. 结构体和联合的初始化:学习如何初始化结构体和联合,包括使用指定初始化器和复合字面量。
  2. 结构体和联合的动态分配:除了在栈上定义结构体和联合,了解如何在堆上动态分配它们,以及如何正确地释放分配的内存。
  3. 位字段的大小和类型:深入了解位字段的使用,包括如何确定位字段的大小和类型,以及如何处理位字段的溢出。
  4. 函数指针与结构体:结合第7章的内容,考虑如何将函数指针与结构体结合使用,以实现回调函数和事件驱动编程。
  5. 代码的可读性和维护性:在使用结构体和联合时,考虑如何编写清晰、易于维护的代码,包括合理的命名约定、注释的使用,以及逻辑的组织。

2. 《Windows C/C++加密解密实战》第14章 SM2算法的实现

算法的安全性和效率:SM2算法在实际应用中的安全性和效率,以及它如何与现有的加密算法(如RSA)相比较。

学习思维导图(2分)

要求

思维导图

1. Head First C 嗨翻 C 语言 第5章


2. 《Windows C/C++加密解密实战》第14章 SM2算法的实现


基于 AI 的学习(2分)

要求

  • 至少找到自己理解不是太好 2 个概念,让 AI 对自己进行苏格拉底提问
  • 参考下面提示语或者使用 AI Agent
    提示词:“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
  1. 核心是要求AI工具:“请你以苏格拉底的方式对我进行提问”
  2. 然后AI工具就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
  3. 如果你觉得差不多了,可以先问问AI工具:“针对我XXX知识点,我理解了吗?”
  4. 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)。
    为了避免悬垂指针问题,应该采取以下措施:
  1. 置空指针:释放内存后,应立即将指针设置为NULL。这样,如果后续代码不小心尝试解引用该指针,将会是一个安全的空操作。
    free(pointer);
    pointer = NULL;
    
  2. 检查指针:在对指针进行操作之前,检查它是否为NULL,可以避免对空指针解引用。
  3. 使用智能指针:如果使用C++,可以考虑使用智能指针(如std::unique_ptrstd::shared_ptr),它们会自动管理内存的生命周期。
  4. 避免重复释放:确保内存只被释放一次,重复释放已释放的内存会导致未定义的行为。
  5. 使用内存管理工具:使用如 Valgrind 等内存调试工具可以帮助检测内存泄漏和悬垂指针问题。
    通过这些措施,可以更安全地管理动态分配的内存,并减少内存相关的错误。

作业提交要求(1分)

  1. 提交Markdown 文件,文档命名“学号姓名《密码系统设计》.md”
  2. 提交Markdown 文件转为 PDF,文档命名“学号姓名《密码系统设计》第 X 周.pdf”
  3. 提交代码托管链接(可选):学号姓名 gitee(github) 链接
  4. 内容质量高有加分

参考资料

posted @ 2024-09-29 18:16  妍妍妍妍  阅读(9)  评论(0编辑  收藏  举报