密码系统设计
第三周预习报告
学习内容
- Head First C 嗨翻 C 语言 第4章
- 《Windows C/C++加密解密实战》第4章
- 重点 4.2,4.3, 4.5
- 课程 mindmap
AI 对学习内容的总结
Head First C 嗨翻 C 语言 - 第4章
章节概述
- 第四章深入介绍了C语言中的数组和指针。这一章通过一系列有趣且富有创意的例子,帮助读者理解数组和指针的概念及其在实际编程中的应用。书中不仅详细解释了数组和指针的基本操作,还探讨了它们之间的关系,以及如何利用指针来操作数组元素。此外,还涉及了一些高级话题,如多维数组、指针算术、字符串处理等。
重点内容
- 数组和指针的关系:解释了数组名实际上是一个指向数组第一个元素的指针,以及如何通过指针来访问数组元素。
- 指针算术:介绍了如何通过指针进行加减运算,以遍历数组或指向不同的数组元素。
- 多维数组:讨论了二维数组和其他多维数组的声明、初始化和访问方法。
- 字符串处理:讲解了C语言中字符串的表示方式,以及如何使用指针进行字符串操作,例如字符串复制、拼接等。
- 动态内存分配:介绍了如何使用malloc、calloc、realloc和free函数动态分配和释放内存。
Windows C/C++加密解密实战 - 第4章
章节概述
- 第四章主要介绍了杂凑函数(Hash Function)和HMAC(Hash-based Message Authentication Code)。这一章首先概述了杂凑函数的基本概念、发展历史和常见类型,接着详细讲解了SM3杂凑算法的具体实现步骤。此外,还介绍了HMAC的工作原理及其在实际应用中的重要性。最后,讨论了SHA系列杂凑算法的特点和实现方法。
重点内容
- 4.2 SM3杂凑算法:
- 常量和函数:定义了SM3算法中使用的常量和函数。
- 填充:描述了如何对输入数据进行填充,使其长度符合算法要求。
- 迭代压缩:解释了如何通过迭代压缩过程生成最终的杂凑值。
- 杂凑值:展示了如何计算最终的32字节杂凑值。
- 实现:提供了SM3算法的一段式和三段式的实现方法。
- 4.3 HMAC:
- 基本概念:介绍了HMAC的基本原理,包括其产生背景、设计目标和算法描述。
- 实现:演示了如何独立实现HMAC-SM3算法。
- 4.5 更通用的基于OpenSSL的哈希运算:
- 获取摘要算法函数:介绍了如何使用EVP_get_digestbyname函数获取指定的摘要算法。
- 创建和销毁摘要上下文:讲解了如何使用EVP_MD_CTX_create和EVP_MD_CTX_destroy函数创建和销毁摘要上下文。
- 初始化、更新和结束摘要:详细描述了如何使用EVP_DigestInit_ex、EVP_DigestUpdate和EVP_Digest_Final_ex函数完成哈希运算的各个阶段。
课程 Mindmap
章节概述
- 课程Mindmap提供了一个可视化的方式来整理和理解本周学习的主要内容。通过Mindmap,可以清晰地看到各个知识点之间的关系和层次结构,有助于巩固记忆和加深理解。
重点内容:
- 数组和指针:通过节点展示数组和指针的基本概念、操作方法及其相互关系。
杂凑函数和HMAC:详细列出了杂凑函数和HMAC的关键概念、算法步骤和实现方法。 - OpenSSL哈希运算:展示了OpenSSL库中与哈希运算相关的函数及其使用方法。
总结
- 本周的学习内容涵盖了C语言中数组和指针的高级应用,以及密码学中的杂凑函数和HMAC。通过《Head First C 嗨翻 C 语言》的趣味讲解,我深入了解了数组和指针的使用技巧;而在《Windows C/C++加密解密实战》中,我掌握了杂凑函数和HMAC的原理及其在OpenSSL中的实现方法。课程Mindmap则帮助我更好地组织和回顾这些知识点。
对 AI 总结的反思与补充
- 这次对AI提出了新的要求,以往的对话中AI总是只完成对重点的概述,现在对章节总体也可以进行总结。
学习思维导图
思维导图
((本周学习内容))
((Head First C 嗨翻 C 语言 - 第4章))
((章节概述))
深入介绍数组和指针
有趣且富有创意的例子
实际编程应用
((重点内容))
((数组和指针的关系))
数组名是常量指针
通过指针访问数组元素
((指针算术))
指针加减运算
遍历数组
((多维数组))
二维数组
多维数组的声明和初始化
((字符串处理))
字符串的表示
字符串操作函数
((动态内存分配))
malloc
calloc
realloc
free
((Windows C/C++加密解密实战 - 第4章))
((章节概述))
介绍杂凑函数和HMAC
基本概念、发展历史和常见类型
SM3杂凑算法的实现
HMAC的工作原理
SHA系列杂凑算法
((重点内容))
((4.2 SM3杂凑算法))
((常量和函数))
定义常量和函数
((填充))
输入数据的填充
((迭代压缩))
生成最终的杂凑值
((杂凑值))
计算32字节杂凑值
((实现))
一段式实现
三段式实现
((4.3 HMAC))
((基本概念))
产生背景
设计目标
算法描述
((实现))
HMAC-SM3算法
((4.5 更通用的基于OpenSSL的哈希运算))
((获取摘要算法函数))
EVP_get_digestbyname
((创建和销毁摘要上下文))
EVP_MD_CTX_create
EVP_MD_CTX_destroy
((初始化、更新和结束摘要))
EVP_DigestInit_ex
EVP_DigestUpdate
EVP_Digest_Final_ex
((课程 Mindmap))
((章节概述))
可视化整理和理解主要内容
清晰展示知识点之间的关系和层次结构
巩固记忆和加深理解
((重点内容))
((数组和指针))
基本概念
操作方法
相互关系
((杂凑函数和HMAC))
关键概念
算法步骤
实现方法
((OpenSSL哈希运算))
函数及其使用方法
基于 AI 的学习
要求
-
至少找到自己理解不是太好 2 个概念,让 AI 对自己进行苏格拉底提问
-
参考下面提示语或者使用 AI Agent
提示词:“我在学习XXX知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”
-
核心是要求AI工具:“请你以苏格拉底的方式对我进行提问”
-
然后AI工具就会给你提问,如果不知道问题的答案,可以反问AI:“你的理解(回答)是什么?”
-
如果你觉得差不多了,可以先问问AI工具:“针对我XXX知识点,我理解了吗?”
-
AI工具会给出它的判断,如果你也觉得自己想清楚了,可以最后问AI工具:“我的回答结束了,请对我的回答进行评价总结”,让它帮你总结一下。
学习内容
知识点1:C语言中的指针和数组的关系
问答
AI:你能告诉我,在C语言中,数组和指针之间有什么关系吗?
我: 数组名可以被视为一个指向数组第一个元素的指针。
AI: 非常好!那么,当你声明一个数组时,比如 int arr[5];
,arr
是什么类型的?
我: arr
是一个指向 int
类型的指针,但它是一个常量指针,不能改变它的值。
AI: 很好!那么,你如何通过指针访问数组中的元素呢?
我: 可以使用指针算术,例如 *(arr + i)
来访问第 i
个元素。
AI: 完全正确!那么,指针和数组在内存布局上有什么不同吗?
我: 数组在内存中是一块连续的空间,而指针只是一个变量,存储的是某个地址。
AI: 很好!那么,你能否举一个例子,说明如何通过指针遍历一个数组?
我: 当然可以。假设有一个数组 int arr[5] = {1, 2, 3, 4, 5};
,可以通过以下代码遍历它:
int *ptr = arr;
for (int i = 0; i < 5; i++) {
printf("%d\n", *ptr);
ptr++;
}
AI: 非常好!那么,你认为在使用指针遍历数组时需要注意哪些问题?
我: 需要注意不要超出数组的边界,避免访问无效的内存地址,这可能导致程序崩溃或未定义行为。
AI: 很好!你对这个知识点的理解非常清楚。那么,针对“C语言中的指针和数组的关系”,你理解了吗?
我: 是的,我已经理解了。
AI: 非常好!你的回答很全面。总结一下:
- 数组名可以被视为一个指向数组第一个元素的常量指针。
- 通过指针算术可以访问数组中的元素。
- 数组在内存中是一块连续的空间,而指针只是一个存储地址的变量。
- 通过指针遍历数组时需要注意不要超出数组的边界。
知识点2:SM3杂凑算法的实现
问答
AI: 你能简单介绍一下SM3杂凑算法吗?
我: SM3是中国国家密码管理局发布的杂凑算法,用于生成固定长度的杂凑值,通常为32字节。
AI: 很好!那么,SM3算法的实现过程中有哪些关键步骤?
我: SM3算法的实现包括以下几个关键步骤:
- 填充:将输入数据填充到合适长度。
- 迭代压缩:通过多轮迭代压缩生成中间值。
- 生成杂凑值:最终生成32字节的杂凑值。
AI: 非常好!那么,你能具体解释一下填充步骤是如何进行的吗?
我: 填充步骤是将输入数据扩展到512位的倍数。首先在输入数据末尾添加一个1,然后添加0直到数据长度达到512位的倍数减去64位,最后添加一个64位的长度值。
AI: 很好!那么,迭代压缩过程中,每一轮的压缩是如何进行的?
我: 每一轮的压缩涉及多个步骤,包括初始向量的设置、消息扩展、非线性变换等。具体来说,每一轮都会更新中间状态值,直到所有块都处理完毕。
AI: 非常好!那么,你能否举一个简单的例子,说明如何使用OpenSSL实现SM3算法?
我: 当然可以。以下是一个使用OpenSSL实现SM3算法的简单示例:
#include <openssl/evp.h>
#include <stdio.h>
void sm3_hash(const unsigned char *data, size_t data_len, unsigned char *hash) {
EVP_MD_CTX *mdctx;
const EVP_MD *md;
unsigned int hash_len;
md = EVP_sm3();
mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, data, data_len);
EVP_DigestFinal_ex(mdctx, hash, &hash_len);
EVP_MD_CTX_free(mdctx);
}
int main() {
const char *input = "Hello, World!";
unsigned char hash[EVP_MAX_MD_SIZE];
unsigned int hash_len;
sm3_hash((const unsigned char *)input, strlen(input), hash);
for (int i = 0; i < 32; i++) {
printf("%02x", hash[i]);
}
printf("\n");
return 0;
}
AI: 非常好!那么,你认为在实现SM3算法时需要注意哪些问题?
我: 需要注意输入数据的填充和长度处理,确保每一轮的压缩正确进行,以及最终生成的杂凑值的正确性和安全性。
AI: 很好!你对这个知识点的理解也非常清楚。那么,针对“SM3杂凑算法的实现”,你理解了吗?
我: 是的,我已经理解了。
AI: 非常好!你的回答很全面。总结一下:
- SM3是中国国家密码管理局发布的杂凑算法,生成32字节的杂凑值。
- 实现过程包括填充、迭代压缩和生成杂凑值。
- 填充步骤将输入数据扩展到512位的倍数。
- 迭代压缩通过多轮非线性变换更新中间状态值。
- 可以使用OpenSSL库实现SM3算法,确保输入数据的正确处理和杂凑值的生成。
学习实践过程遇到的问题与解决方式(AI 驱动,优先使用AI工具解决问题)
- 问题1:在使用指针遍历数组时,容易超出数组的边界,导致未定义行为或程序崩溃。
- 解决方式:检查边界,确保循环中的指针不会超过数组的最后一个元素。
- 问题2:在实现迭代压缩时,容易忽略某些步骤或错误地实现非线性变换。
- 解决方式:每一轮的压缩涉及初始向量的设置、消息扩展、非线性变换等;查阅SM3算法的官方文档或标准,确保每一步都正确实现。