《密码系统设计》第三周
第三周预习报告
学习内容
- Head First C 嗨翻 C 语言 第4章
- 《Windows C/C++加密解密实战》第4章
- 重点 4.2,4.3,4.5
- 课程 mindmap
- 报告内容参考第一周
AI 对学习内容的总结(1分)
要求
- 让AI阅读学习内容并进行总结
总结
1. Head First C 嗨翻 C 语言 第4章
在C语言中,函数是执行特定任务的代码块,可以被重复调用。以下是一些关于C语言函数的关键点:
- 定义函数:使用关键字
int
(或其他数据类型)和return
语句来定义一个函数,这表示函数的返回类型和返回值。- 函数参数:函数可以有参数,这些参数在函数调用时传递给函数,用于传递数据。
- 局部变量:在函数内部定义的变量称为局部变量,它们只在函数内部可见。
- 返回值:函数可以通过
return
语句返回一个值给调用者。- 函数调用:调用函数时,需要使用函数名和括号,括号内可以包含传递给函数的参数。
- 函数原型:在C语言中,可以在函数实际定义之前声明函数原型,这有助于编译器理解函数的类型和参数。
- 作用域:函数内部的变量只在该函数内部有效,而全局变量则在整个程序中都有效。
- 递归:函数可以调用自身,这种技术称为递归,常用于解决复杂问题,如算法中的树遍历。
- 函数指针:在C语言中,可以创建指向函数的指针,这允许更高级的编程技巧,如回调函数。
- 标准库函数:C语言提供了许多标准库函数,如
printf
和scanf
,这些函数在程序中广泛使用。
2. 《Windows C/C++加密解密实战》4.2 SM3杂凑算法
- 算法概述:
- SM3算法由王小云等人设计,用于生成256比特(32字节)的杂凑值。
- 算法采用Merkle-Damgard结构,消息分组为512比特,输出杂凑值为256比特。
- 算法的压缩函数与SHA-256类似,但设计更为复杂,如每轮使用两个消息字,消息拓展过程使用5个消息字。
- 算法细节:
- 常量和函数:定义了算法中使用的初始值IV、常量和布尔函数。
- 填充:消息末尾添加一个“1”和若干“0”,以及一个64位的比特串表示消息长度,确保填充后的消息长度为512的倍数。
- 迭代压缩:将消息分组,通过压缩函数迭代生成杂凑值。
- 消息扩展:将消息分组扩展为多个字,用于压缩函数。
- 压缩函数:使用字寄存器和中间变量,按照一定的计算流程生成杂凑值。
- 算法实现:
- 一段式实现:提供了一个函数,输入全部消息,得到哈希值。
- 三段式实现:提供了初始化(Init)、中间处理(Update)和结束(Final)三个函数,适用于分批处理消息的场景。
- OpenSSL实现:介绍了如何使用OpenSSL库中的函数来实现SM3算法,这种方法简化了实现过程。
- 实践指南:
- 提供了使用Visual C++ 2017实现SM3算法的步骤,包括新建工程、编写代码、设置编译选项等。
- 提供了具体的代码示例,包括一段式和三段式SM3算法的实现,以及如何使用OpenSSL库。
- 测试和验证:
- 描述了如何编写测试代码来验证算法实现的正确性,并展示了预期的运行结果。
3. 《Windows C/C++加密解密实战》4.3 HMAC
- 定义:HMAC是一种结合了密钥和哈希函数的消息认证方法,它可以与任何迭代型散列函数一起使用,如SM3、SHA-1、SHA-256等。
- 产生背景:随着互联网的发展,网络安全变得越来越重要。HMAC提供了一种通过散列函数进行消息认证的方法,确保消息在传输过程中的完整性和发送者的身份验证。
- 设计目标:
- 直接使用已知的散列函数,易于实现且执行速度快。
- 能够轻松替换为更快或更安全的散列函数。
- 保持散列函数的性能,不因嵌入HMAC而降低。
- 密钥的使用和处理简单。
- 能够根据散列函数的强度推断出认证机制的安全性。
- 算法描述:
- HMAC算法需要一个哈希函数和一个密钥。
- 密钥长度大于哈希函数块大小时,先进行哈希处理;小于则填充至块大小。
- 使用密钥与特定填充(ipad和opad)进行两次哈希运算,第一次使用ipad,第二次使用opad。
- 运算步骤:
- 检查并调整密钥长度。
- 将密钥与ipad进行异或运算。
- 将消息与上一步的结果结合,进行哈希运算。
- 将密钥与opad进行异或运算。
- 将上一步的哈希结果与opad的结果结合,进行第二次哈希运算。
- 输出最终的HMAC值。
- 代码实现:您提供了一个使用C++实现HMAC-SM3算法的例子,包括了函数的声明、实现和测试代码。这个过程展示了如何将HMAC算法应用到实际的编程中,以确保数据的安全性。
4. 《Windows C/C++加密解密实战》4.5 更通用的基于OpenSSL的哈希运算
- EVP概述:
- EVP是OpenSSL中的一个高级加密算法库,它封装了多种加密算法,使得开发者可以通过统一的接口使用不同的加密技术。
- EVP函数:
EVP_MD_CTX_create
:创建并初始化摘要上下文结构体。EVP_MD_CTX_destroy
:销毁摘要上下文结构体。EVP_DigestInit_ex
:初始化摘要算法。EVP_DigestUpdate
:更新摘要计算,可以多次调用以处理大数据。EVP_Digest_Final_ex
:完成摘要计算并输出结果。EVP_Digest
:用于计算短消息的摘要。
- 获取摘要算法:
EVP_get_digestbyname
:根据算法名称(如"sha256")获取对应的摘要算法结构体。
- 使用EVP进行哈希运算:
- 首先,需要包含头文件
#include<openssl/evp.h>
。- 使用
EVP_MD_CTX_create
创建并初始化摘要上下文。- 使用
EVP_DigestInit_ex
设置摘要算法。- 通过
EVP_DigestUpdate
多次更新数据,实现多包哈希运算。- 最后,使用
EVP_Digest_Final_ex
获取哈希结果。
- 代码示例:
- 提供了一个示例代码,展示了如何使用EVP进行SHA512哈希运算。
- 示例中演示了如何更换哈希算法,只需更改
EVP_get_digestbyname
的参数。- 还展示了如何进行多包哈希运算,并格式化输出哈希结果。
- 配置环境:
- 在Visual Studio中配置工程,需要添加OpenSSL的包含目录和库目录。
- 运行结果:
- 运行示例代码后,将显示计算出的哈希值。
对 AI 总结的反思与补充(2分)
要求
- AI总结的问题
- 自己的补充
反思与补充
1. 反思
在学习中利用AI助手对知识点进行总结,可以帮助我们对知识点进行梳理,有助于我们更全面地理解、掌握学习内容。同时,AI助手还能帮助我们对不理解的知识点展开更为详细的解释,确保我们能对所学内容清晰掌握。
2. 补充
1. Head First C 嗨翻 C 语言 第4章
- 函数的重要性:函数是编程中的基础构件,它们帮助我们模块化代码,提高代码的可读性和可重用性,我们应该思考如何设计函数以使其更加高效和易于维护。
- 参数传递:C语言中有两种参数传递方式:值传递和指针传递。值传递是默认方式,它传递参数的副本,而指针传递则允许函数直接修改原始数据。理解这两种方式的区别对于编写正确的程序至关重要。
- 函数的副作用:一些函数可能会改变程序的状态,例如修改全局变量或文件系统。在设计和使用函数时,应该明确函数的副作用,并考虑它们对程序行为的影响。
2. 《Windows C/C++加密解密实战》4.2 SM3杂凑算法
- 算法安全性:
文章主要介绍了算法的实现,但没有深入讨论SM3算法的安全性。在实际应用中,了解算法的安全性和抗攻击能力是非常重要的。需要补充学习一些关于SM3算法安全性的研究和分析,以及它在不同场景下的适用性。- 性能考量:
算法的效率和性能也是实际应用中需要考虑的因素。需要补充学习一些关于SM3算法在不同硬件和软件环境下的性能测试结果,以及与其他杂凑算法(如SHA-256)的性能比较。
3. 《Windows C/C++加密解密实战》4.3 HMAC
- 安全性分析:
- 需要考虑HMAC在不同场景下的安全性,包括对抗常见的攻击手段,如重放攻击、篡改攻击等。
- 分析密钥管理的重要性,因为密钥的泄露或弱密钥都可能导致HMAC机制的失效。
- 密钥长度和强度:
- 密钥长度应足够长,以抵抗暴力破解攻击。
- 密钥应该随机生成,并且每次通信都尽可能使用不同的密钥。
4. 《Windows C/C++加密解密实战》4.5 更通用的基于OpenSSL的哈希运算
- 安全性考虑:
在使用EVP进行哈希运算时,需要考虑算法的安全性。例如,SHA-1算法已经不再被认为是安全的,因为它容易受到碰撞攻击。因此,选择如SHA-256或更高版本的哈希算法是更安全的选择。- 错误处理:
在实际应用中,对每个EVP函数调用的结果进行检查是非常重要的。如果函数返回0,应该检查并处理错误,例如通过调用ERR_print_errors_fp(stderr)
来打印错误信息。
学习思维导图(2分)
要求
- Mermaid 代码与截图(参考Mermaid MindMap语法)或者提交思维导图链接(如果使用线上编辑器,推荐processon,xmind,…)
思维导图
1. Head First C 嗨翻 C 语言 第4章
2. 《Windows C/C++加密解密实战》4.2 SM3杂凑算法
3. 《Windows C/C++加密解密实战》4.3 HMAC
4. 《Windows C/C++加密解密实战》4.5 更通用的基于OpenSSL的哈希运算
基于 AI 的学习(2分)
要求
- 至少找到自己理解不是太好 2 个概念,让 AI 对自己进行苏格拉底提问
- 参考下面提示语或者使用 AI Agent
提示词:“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
- 核心是要求AI工具:“请你以苏格拉底的方式对我进行提问”
- 然后AI工具就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
- 如果你觉得差不多了,可以先问问AI工具:“针对我XXX知识点,我理解了吗?”
- AI工具会给出它的判断,如果你也觉得自己想清楚了,可以最后问AI工具:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
学习内容
1. 针对SM3杂凑算法进行提问
2. 针对HMAC进行提问
作业提交要求(1分)
- 提交Markdown 文件,文档命名“学号姓名《密码系统设计》.md”
- 提交Markdown 文件转为 PDF,文档命名“学号姓名《密码系统设计》第 X 周.pdf”
- 提交代码托管链接(可选):学号姓名 gitee(github) 链接
- 内容质量高有加分
参考资料
- AI工具(你使用的AI工具及其链接)
- Kimi
- 图书
- 《Windows C/C++加密解密实战》
- Head First C 嗨翻 C 语言